带有Mockito Mock的Apache Camel Route的JUnit测试不会失败

时间:2019-03-01 14:38:41

标签: java unit-testing spring-boot apache-camel mockito

我编写了一个骆驼路线,该路线使用带有Processor的DLC模式,并在Exchange发送到DLC之前执行。

errorHandler(deadLetterChannel("{{myDLCEndpoint}}")
                .onPrepareFailure(getErrorProcessor()));

在路线期间,我抛出了RuntimeException,然后由errorProcessor和DLC处理。启动应用程序并运行路由时,一切正常。

现在我想编写一个单元测试,只是要确保它可以工作。

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
@RunWith(SpringRunner.class)
public class MyRouteTest {
@MockBean
    private ErrorProcessor errorProcessor;

    @EndpointInject(uri = "{{quelle}}")
    private ProducerTemplate quelle;

    @EndpointInject(uri = "{{myDLCEndpoint}}")
    private ProducerTemplate dlc;

    @Test
    @Transactional("myDataSourceTransactionManager") //For Rollback
    public void test() throws Exception {
        Mockito.verify(errorProcessor, never()).process(Mockito.any());

        String inputXML = TestDataReader.readXML("myfile.xml");
        assertNotNull(inputXML);

        quelle.sendBody(inputXML);
    }
}

我开始测试并检查了日志,但不幸的是,在执行路由期间发生了异常。异常是由骆驼处理的,并且肯定会调用模拟的错误处理器,因为我已经调试了它:

debugger: the mocked bean is called for sure!

不幸的是,即使使用Mockito.verify(errorProcessor, never()).process(Mockito.any());

,单元测试仍然成功

现在我不知道为什么它不会失败,这是我在这种情况下期望的结果吗?

1 个答案:

答案 0 :(得分:1)

我是个白痴。 Mockito.verify的呼叫在呼叫quelle.sendBody之前。 WAAAH。抱歉,我没看到:-D

使Mockito正常工作的正确方法是:

        String inputXML = TestDataReader.readXML("myfile.xml");
        assertNotNull(inputXML);

        quelle.sendBody(inputXML);
        //call mockito AFTER the test is executed! 
        Mockito.verify(errorProcessor, never()).process(Mockito.any());