我正在使用 Camel 进行简单的单元测试。我想做的就是从文件(在资源下)读取 JSON 内容,将其发送到 Java 类进行验证 - 这是我试图测试的路线。无论我做什么,模板(我用于 sendBody(json) 的值始终为 null。这是我的代码:
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,但我不知道如何绑定(bind)。我只是使用了我的验证类的名称,但我不知道这是否正确。
但模板始终为空。 null pointer exception (NPE) 位于
template.sendBody("direct:start", testJson);
如果有必要,请给我一些读物。 Apache Camel 文档链接到的引用代码甚至没有我在 setUp 方法中所做的 Camel 的启动。
最佳答案
我认为您已经错过了 CamelTestSupport
为您提供的许多真正有用的东西。它有自己的 setUp
方法,您应该重写该方法。我相信你的测试应该看起来像这样:
public class RouteTests extends CamelTestSupport {
private JSONObject testJson;
@Override
public void setUp() throws Exception {
// REALLY important to call super
super.setUp();
ObjectMapper objectmapper = new ObjectMapper();
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream stream = loader.getResourceAsStream("test.json");
testJson = new JSONObject(objectmapper.readValue(stream, Map.class));
}
@Override
protected RouteBuilder createRouteBuilder() {
return new RouteBuilder() {
@Override
public void configure() {
from("direct:start")
.filter().method(ValidationProcessor.class, "validate")
.to("mock:result");
}
};
}
@Test
public void testSendMatchingMessage() throws Exception {
MockEndpoint resultEndpoint = getMockEndpoint("mock:result");
resultEndpoint.expectedMessageCount(1);
template.sendBody("direct:start", testJson);
resultEndpoint.assertIsSatisfied();
}
}
实际上,我会完全删除 setUp
的覆盖,并将测试数据的读取放入测试方法本身。这样就清楚了数据的用途,并且您可以消除 testJson
字段。
public class RouteTests extends CamelTestSupport {
@Override
protected RouteBuilder createRouteBuilder() {
return new RouteBuilder() {
@Override
public void configure() {
from("direct:start")
.filter().method(ValidationProcessor.class, "validate")
.to("mock:result");
}
};
}
@Test
public void testSendMatchingMessage() throws Exception {
ObjectMapper objectmapper = new ObjectMapper();
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream stream = loader.getResourceAsStream("test.json");
JSONObject testJson = new JSONObject(objectmapper.readValue(stream, Map.class));
MockEndpoint resultEndpoint = getMockEndpoint("mock:result");
resultEndpoint.expectedMessageCount(1);
template.sendBody("direct:start", testJson);
resultEndpoint.assertIsSatisfied();
}
}
有了,简单多了。
关于java - 使用cameltestsupport进行Camel单元测试,模板始终为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49118176/