如何输入和测试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方法抛出一个MarshalSendAndReceiveExceptionpreAuthCompleteRequestServiceImpl.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); 
} 
+0

感谢您的100%测试覆盖范围;) – Patrick