【发布时间】:2018-03-05 19:37:34
【问题描述】:
我正在使用 Camel 进行简单的单元测试。我要做的就是从文件中读取 JSON 内容(在资源下),将其发送到 Java 类进行验证 - 这是我要测试的路线。无论我做什么,模板(我用于 sendBody(json) 的模板始终为空。这是我的代码:
public class RouteTests extends CamelTestSupport {
@EndpointInject(uri = "mock:result")
protected MockEndpoint resultEndpoint;
@Produce(uri = "direct:start")
protected ProducerTemplate template;
@Autowired
JSONObject testJson;
@Before
public void setUp() throws Exception {
try {
final ObjectMapper objectmapper = new ObjectMapper();
final ClassLoader loader = Thread.currentThread().getContextClassLoader();
final InputStream stream = loader.getResourceAsStream("test.json");
testJson = new JSONObject ((Map)objectmapper.readValue(stream, Map.class));
// Start Camel
context = new DefaultCamelContext();
context.addRoutes(createRouteBuilder());
context.start();
}
catch (IOException e) {
}
}
@Test
public void testSendMatchingMessage() throws Exception {
//resultEndpoint.expectedBodiesReceived(expectedBody);
resultEndpoint = getMockEndpoint("mock:result");
//resultEndpoint = context.getEndpoint("mock:result", MockEndpoint.class);
resultEndpoint.expectedMessageCount(1);
template.sendBody("direct:start", testJson);
resultEndpoint.assertIsSatisfied();
}
@Override
protected RouteBuilder createRouteBuilder() {
return new RouteBuilder() {
public void configure() {
from("direct:start")
.filter().method(ValidationProcessor.class, "validate")
.to("mock:result");
}
};
}
@Override
protected JndiRegistry createRegistry() throws Exception {
JndiRegistry jndi = super.createRegistry();
jndi.bind("ValidationProcessor", new ValidationProcessor", ());
return jndi;
}
}
我遇到的问题:
-
最初结果端点也始终为空。 (我使用 FilterTest.java 作为参考)。然后我不得不做一个明确的
resultEndpoint = getMockEndpoint("mock:result");解决这个问题。
-
然后我读到我必须重写 createRegistry,但我不知道如何绑定。我只是使用了我的验证类的名称,但我不知道这是否正确。
但模板始终为空。 null pointer exception (NPE) 位于
template.sendBody("direct:start", testJson);
如有必要,还请指点我阅读。 Apache Camel 文档链接到的参考代码甚至没有我在 setUp 方法中所做的 Camel 的开头。
【问题讨论】:
-
你不应该自己创建 CamelContext 而是让
CamelTestSupport为你创建它。作为其设置的一部分,它设置了一些 IoC 的东西。但请注意,您有 Spring@Autowired不是 Camel,如果是这样,您需要扩展CamelSpringTestSupport。如果您同时使用 Camel 和 Spring,请参阅 camel-test-spring 中的单元测试。此外,CiA2 书中有一整章是关于测试的。 -
会听从您的建议,谢谢。我也要去读你提到的那本书的章节。
-
那是需要 createRegistry 覆盖的时候吗?即使以下解决方案有效,我仍然不清楚:D
-
重写 createRegistry 是一个巧妙的技巧,允许从 java 代码绑定 bean,这在使用 spring 时可能有点棘手。书中的第 4 章涵盖了各种 Camel Registry 实现。
-
我认为代码无法编译 - 靠近
jndi.bind("ValidationProcessor", new ValidationProcessor",(这也在初始修订版中)。这由奇怪的语法突出显示。
标签: java unit-testing apache-camel