如何输入和测试catch子句。春季启动,Junit,Mockito
问题描述:
我正试着测试下面的代码部分。特别是渔获:如何输入和测试catch子句。春季启动,Junit,Mockito
try {
preAuthCompleteResponse = preAuthCompleteClient
.getPreAuthCompleteResponse(preAuthCompleteServiceImpl.getPreAuthComplete(
preAuthCompleteRequestServiceImpl.getPreAuthCompleteRequest(preAuthCompleteModel)));
} catch (IOException | MarshalSendAndReceiveException e) {
logger.error(e.getMessage(), e);
return new ResponseEntity<>(
new SvsTransactionResponseModel(HttpStatus.BAD_REQUEST, e.getMessage()),
HttpStatus.BAD_REQUEST);
}
在一个测试中,我想指望一个IOException
被获取,并在其他测试中,我想指望一个MarshalSendAndReceiveException
被逮住。两者均返回SvsTransactionResponseModel
,状态为HttpStatus.BAD_REQUEST
。
preAuthCompleteClient.getPreAuthCompleteResponse
方法抛出一个MarshalSendAndReceiveException
和preAuthCompleteRequestServiceImpl.getPreAuthCompleteRequest
抛出一个IOException
。
我的测试看起来像这样:
@RunWith(MockitoJUnitRunner.class)
public class PreAuthCompleteControllerTest {
@Mock
private PreAuthCompleteService preAuthCompleteServiceImpl;
@Mock
private PreAuthCompleteRequestService preAuthCompleteRequestServiceImpl;
@Mock
private PreAuthCompleteClient preAuthCompleteClient;
@Mock
private Errors errors;
private PreAuthCompleteController preAuthCompleteController;
@Before
public void setUp() {
preAuthCompleteController = new PreAuthCompleteController(preAuthCompleteServiceImpl,
preAuthCompleteRequestServiceImpl, preAuthCompleteClient);
}
@Test
public void testGetPreAuthCompleteExpectIOException() throws MarshalSendAndReceiveException, IOException {
when(preAuthCompleteClient.getPreAuthCompleteResponse(preAuthCompleteServiceImpl.getPreAuthComplete(
preAuthCompleteRequestServiceImpl.getPreAuthCompleteRequest(new PreAuthCompleteModel()))))
.thenReturn(new PreAuthCompleteResponse());
ResponseEntity<SvsTransactionResponseModel> responseEntity = (ResponseEntity<SvsTransactionResponseModel>) preAuthCompleteController
.getPreAuthComplete(null, errors);
assertTrue(responseEntity.getBody() != null);
assertTrue(responseEntity.getStatusCodeValue() == 400);
}
}
我试着用Mockito.when,Mockito.thenThrow或doThrow等不同的解决方案。但有不同的例外或不成功的测试。我没有想法。
如何测试异常是否被捕获并且ResponseEntity正确返回。
P.S.所有的模拟配置工作。
答
为了让事情我已经打破这个呼叫读...
preAuthCompleteResponse = preAuthCompleteClient
.getPreAuthCompleteResponse(preAuthCompleteServiceImpl.getPreAuthComplete(
preAuthCompleteRequestServiceImpl.getPreAuthCompleteRequest(preAuthCompleteModel)));
...分解成各个组成部分:
PreAuthCompleteRequest preAuthCompleteRequest = preAuthCompleteRequestServiceImpl.getPreAuthCompleteRequest(preAuthCompleteModel);
PreAuthComplete preAuthComplete = preAuthCompleteServiceImpl.getPreAuthComplete(preAuthCompleteRequest);
PreAuthCompleteResponse preAuthCompleteResponse = preAuthCompleteClient.getPreAuthCompleteResponse(preAuthComplete);
我猜对返回类型( PreAuthCompleteRequest
,PreAuthComplete
等),但你明白了(我认为:)。鉴于上述呼叫序列,应通过以下测试:
@Test
public void badRequestWhenPreAuthCompleteResponseFails() {
// preAuthCompleteController.getPreAuthComplete() invokes
// preAuthCompleteClient.getPreAuthCompleteResponse()
// and any MarshalSendAndReceiveException throw by that client should result in a BAD_REQUEST
MarshalSendAndReceiveException expectedException = new MarshalSendAndReceiveException("boom!");
when(preAuthCompleteClient.getPreAuthCompleteResponse(Mockito.any(PreAuthComplete.class))).thenThrow(expectedException);
ResponseEntity<SvsTransactionResponseModel> responseEntity = (ResponseEntity<SvsTransactionResponseModel>) preAuthCompleteController
.getPreAuthComplete(null, errors);
assertTrue(responseEntity.getBody() != null);
assertTrue(responseEntity.getStatusCodeValue() == 400);
}
@Test
public void badRequestWhenPreAuthCompleteRequestFails() {
// preAuthCompleteController.getPreAuthComplete() invokes
// preAuthCompleteClient.getPreAuthCompleteResponse() which then invokes
// preAuthCompleteServiceImpl.getPreAuthComplete() which then invokes
// preAuthCompleteRequestServiceImpl.getPreAuthCompleteRequest
// and any IOException throw by that call should result in a BAD_REQUEST
IOException expectedException = new IOException("boom!");
when(preAuthCompleteRequestServiceImpl.getPreAuthCompleteRequest(Mockito.any(PreAuthCompleteModel.class))).thenThrow(expectedException);
ResponseEntity<SvsTransactionResponseModel> responseEntity = (ResponseEntity<SvsTransactionResponseModel>) preAuthCompleteController
.getPreAuthComplete(null, errors);
assertTrue(responseEntity.getBody() != null);
assertTrue(responseEntity.getStatusCodeValue() == 400);
}
感谢您的100%测试覆盖范围;) – Patrick