Java 在单元测试中用于在新JndiContext中构造bean时,ProducerTemplate为null
在单元测试中用于在新JndiContext中构造bean时,ProducerTemplate为null 我正在尝试对一个路由进行单元测试,该路由使用bean动态构建sftp端点。当我在正常的上下文中运行我的路由时,这会起作用,因为似乎注册表中已经有一个模板,并且可以正确地注入 我的问题是,在尝试构造单元测试时,我似乎遇到了这样一种情况:当调用Java 在单元测试中用于在新JndiContext中构造bean时,ProducerTemplate为null,java,unit-testing,apache-camel,Java,Unit Testing,Apache Camel,在单元测试中用于在新JndiContext中构造bean时,ProducerTemplate为null 我正在尝试对一个路由进行单元测试,该路由使用bean动态构建sftp端点。当我在正常的上下文中运行我的路由时,这会起作用,因为似乎注册表中已经有一个模板,并且可以正确地注入 我的问题是,在尝试构造单元测试时,我似乎遇到了这样一种情况:当调用createJndiContext时,ProducerTemplate仍然为null,这导致我的bean中的NPE需要调用模板上的方法 任何帮助都将不胜感激
createJndiContext
时,ProducerTemplate仍然为null,这导致我的bean中的NPE需要调用模板上的方法
任何帮助都将不胜感激
下面是一个简化的单元测试,说明了这一点:
public class BeanWithProdTemplateDependencyTest
extends CamelTestSupport
{
private static final Logger log = LoggerFactory.getLogger(BeanWithProdTemplateDependencyTest.class);
private static final String FROM = "direct:start";
@EndpointInject(uri = "mock:result")
protected MockEndpoint resultEndpoint;
@Before
public void setUp() throws Exception {
super.setUp();
context.getRouteDefinition("my-cool-route").adviceWith(context, new AdviceWithRouteBuilder()
{
@Override
public void configure()
throws Exception
{
replaceFromWith(FROM);
}
});
startCamelContext();
}
@Test
public void test()
{
template.sendBody(FROM, "cheese");
}
@Override
public boolean isUseAdviceWith()
{
return true;
}
@Override
protected Context createJndiContext()
throws Exception
{
JndiContext context = new JndiContext();
MyBean myBean = new MyBean(template);
context.bind("myBean", myBean);
return context;
}
@Override
protected RouteBuilder createRouteBuilder()
throws Exception
{
return new RouteBuilder()
{
@Override
public void configure()
throws Exception
{
from("jms:queue:inbox")
.routeId("my-cool-route")
.beanRef("myBean", "doStuff")
.log("Body: $body}")
.to("mock:result");
}
};
}
public class MyBean {
private final ProducerTemplate producerTemplate;
public MyBean(ProducerTemplate template)
{
this.producerTemplate = template;
}
public void doStuff() throws Exception{
// NPE here, template is null
this.producerTemplate.sendBody("seda:foo", "beer");
}
}
}
我用一点小技巧解决了这个问题 我想做的太多太快了。我消除了对
createJndiContext()
的覆盖,并在测试中将这些行添加到setUp()
方法中:
MyBean myBean = new MyBean(template);
JndiRegistry registry = (JndiRegistry) (
(PropertyPlaceholderDelegateRegistry)context.getRegistry()).getRegistry();
registry.bind("myBean", myBean);
这允许我使用非空的ProducerTemplate创建bean,并将其推入由CamelTestSupport.setUp()
创建的注册表。通过查看代码,我可以看到这是如何发生的,因为创建Camel上下文的操作也会生成bean JndiRegistry以及创建模板之前发生的所有事情。那我怎么短路呢?