我有一条看起来像这样的骆驼路线:
<camel:camelContext id="context" xmlns="http://camel.apache.org/schema/spring">
<propertyPlaceholder id="camelContextProperties" location="ref:lefrogen"/>
<contextScan/>
<template id="producerTemplate"/>
<route id="chibzo">
<from uri="activemq:queueName"/>
<to uri="seda:internal?multipleConsumers=true"/>
</route>
<route id="chon">
<from uri="seda:internal?multipleConsumers=true"/>
<bean ref="beanName"/>
<to uri="seda:external?multipleConsumers=true"/>
</route>
</camel:camelContext>
bean类是这样的:
@Component
public class BeanName {
private final static Logger LOGGER = Logger.getLogger(BeanName.class.getName());
public static String message =null;
public static String map(String custom) {
message = custom;
return custom;
}
}
我编写了一个单元测试用例,它应该调用map方法,从seda:external获取数据,并比较map methos和seda:external的值。现在,我遇到了一个问题,如果我使用mvn test执行我的测试用例,我的测试类中有一个记录器,它打印出map方法的值。然而,当我向队列发送内容时,该方法返回null。这是单元测试:
public class Test{
@EndpointInject
ProducerTemplate producerTemplate;
@Autowired
BeanName beanName;
@Test
public void testName() throws Exception {
producerTemplate.sendBody("seda:internal","Good bye");
String message = beanName.message;
LOGGER.info("Printing" + message);
}
有人能告诉我为什么我会变空吗?
答案 0 :(得分:0)
这似乎是一个时间问题。
SEDA是异步的(您在an asynchronous way中调用它)。这意味着只要您将消息发送到SEDA队列,就可以在下一个语句(您正在抓取消息值)的位置继续进行处理。
因此,在尝试获取消息之前,beanName.map()
极不可能被调用。更可能的情况是您收到消息,一段时间后调用map
方法来实际分配消息。
你做了什么呢?你有几个选择。
最少侵入性的方法是在发送消息之后和从bean中获取消息之前添加Thread.sleep(..)
。
您可以使用adviceWith
替换SEDA的direct
端点,并使用reqeustBody
而不是sendBody
进行调用。
或者,如果您仍想测试异步调用,可以在bean之后建议mock endpoint(也许代替对seda:external
的调用)。您可以在模拟上设置断言并等待(使用超时),直到满足模拟断言,使用mock.assertIsSatisfied(1, TimeUnit.SECONDS);