使用“@SpringBootApplication”和“@MockEndpoints”进行Camel Spring测试,打破所有单元测试

时间:2017-11-24 12:58:13

标签: java spring-boot junit apache-camel

我有camel + springboot应用程序。还有一些单元测试:一个测试用于一个处理器。他们扩展了CamelTestSupport。他们在工作。 例如:

public class FaultProcessorTest extends CamelTestSupport {
    private static final Logger LOGGER = LoggerFactory.getLogger(FaultProcessorTest.class);
    @EndpointInject(uri = "mock:result")
    protected MockEndpoint mockResult;

    @Test
    public void testProcess() throws InterruptedException {
        LOGGER.info("FaultProcessorTest.testProcess()");
        String body = "AnyNoMatterBody";
        MockEndpoint mockResult = template.getCamelContext().getEndpoint("mock:result", MockEndpoint.class);
        template.setDefaultEndpointUri("direct:in");
        Exchange exchange = template.getDefaultEndpoint().createExchange();

        exchange.setProperty("requestId", "req00001");
        exchange.setProperty("targetSYS1Id", "tSYS100001");
        exchange.setProperty("FaultDetails", " FaultProcessorTest fault Details");
        exchange.setProperty("FaultActor", "TestFault");
        mockResult.setExpectedMessageCount(2);

        mockResult.whenAnyExchangeReceived(exc -> {
            MyProcResp res = MyProcResp.class
                    .cast(exc.getIn().getBody(MyProcResp.class));
            assertTrue("assertion failed:  res.getFaults().size() > 0", res.getFaults().size() > 0);
            assertTrue("assertion failed: res.getStatus().equals(Status.FAILED.name())",
                    res.getStatus().equals(Status.FAILED.name()));
            assertTrue("assertion failed: res.getRequestId()!=null && res.getRequestId().equals(\"req00001\")",
                    res.getRequestId() != null && res.getRequestId().equals("req00001"));
            assertTrue("assertion failed: res.getTargetSYS1Id()!=null && res.getTargetSYS1Id().equals(\"tSYS100001\")",
                    res.getTargetSYS1Id() != null && res.getTargetSYS1Id().equals("tSYS100001"));
        });
        template.send(exchange);
        exchange.getIn().setBody(body);
        template.send(exchange);
        mockResult.assertIsSatisfied();
    }

    @Override
    // create route with their end-points in context
    protected RoutesBuilder createRouteBuilder() throws Exception {
        RouteBuilder response = new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                from("direct:in").process(new FaultProcessor()).to("mock:result");
            }
        };
        return response;
    }
}

但后来我想测试Route“As Is”。模拟他们的端点,向一个人发送消息,从另一个人那里获取消息。它的效果非常好。 我的路线:

@Component
public class MyRoute extends RouteBuilder {
    @Autowired
    private FaultProcessor faultProcessor;

    @Value("${myprop.property1}")
    private long property1;

     @Override
    public void configure() throws Exception {
        ... Any nomatter content...

        from("direct:testReq").to("direct:testRes");
    }
}

我的路线测试:

@RunWith(CamelSpringBootRunner.class)
@MockEndpoints
@SpringBootApplication
@ContextConfiguration(classes = Application.class)
@TestPropertySource("classpath:application4test.properties")
@DirtiesContext(classMode=ClassMode.AFTER_CLASS)
public class MyRouteTest {
    @Produce(uri = "direct:testReq")
    private ProducerTemplate producer;

    @EndpointInject(uri = "mock://direct:testRes")
    private MockEndpoint mock;

    @Test
    public void testRoute() throws Exception {
        mock.setExpectedMessageCount(1);
        mock.whenAnyExchangeReceived(exc -> System.out.println("---check point---"));
        producer.setDefaultEndpointUri("direct:testReq");
        producer.sendBody("nomatter body");
        mock.assertIsSatisfied();
    }
}

问题是:如果我一起运行所有测试(“mvn test”),那么所有“简单”的junit测试都处于状态 - 失败状态。我认为,端点不会被嘲笑。

如果我在没有“MyRouteTest”的情况下运行它们(删除它或逐个启动其他测试,比如“mvn -Dtest = FaultProcessorTest test”)它们都是 - “成功”。

有什么问题?为什么“单位”测试取决于另一个?

0 个答案:

没有答案