在单元测试中没有从bean获得价值

时间:2014-11-13 02:22:21

标签: java spring unit-testing maven apache-camel

我有一条看起来像这样的骆驼路线:

 <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);
}

有人能告诉我为什么我会变空吗?

1 个答案:

答案 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);

之类的东西