【问题标题】:How to enter and test catch clause. Spring-boot, Junit, Mockito如何输入和测试 catch 子句。 Spring-boot,Junit,Mockito
【发布时间】:2017-10-19 07:19:57
【问题描述】:

我正在尝试测试以下代码部分。尤其是抓住:

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 正确返回。

附:所有的模拟配置工作。

【问题讨论】:

    标签: spring unit-testing spring-boot junit mockito


    【解决方案1】:

    为了帮助理解我打断了这个电话的事情......

    preAuthCompleteResponse = preAuthCompleteClient
          .getPreAuthCompleteResponse(preAuthCompleteServiceImpl.getPreAuthComplete(
            preAuthCompleteRequestServiceImpl.getPreAuthCompleteRequest(preAuthCompleteModel)));
    

    ... 分解成它的组成部分:

    PreAuthCompleteRequest preAuthCompleteRequest = preAuthCompleteRequestServiceImpl.getPreAuthCompleteRequest(preAuthCompleteModel);
    
    PreAuthComplete preAuthComplete = preAuthCompleteServiceImpl.getPreAuthComplete(preAuthCompleteRequest);
    
    PreAuthCompleteResponse preAuthCompleteResponse = preAuthCompleteClient.getPreAuthCompleteResponse(preAuthComplete);
    

    我猜测返回类型(PreAuthCompleteRequestPreAuthComplete 等),但你明白了(我认为 :)。鉴于上述调用顺序,应通过以下测试:

    @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% 的测试覆盖率 ;)
    猜你喜欢
    • 2018-12-23
    • 2020-01-20
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 2022-09-24
    • 2017-06-06
    相关资源
    最近更新 更多