java - 使用cameltestsupport进行Camel单元测试,模板始终为空

标签 java unit-testing apache-camel

我正在使用 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;
    }
}

我遇到的问题:

  1. 最初,结果终点也始终为空。 (我使用 FilterTest.java 作为引用)。然后我必须做一个明确的

     resultEndpoint = getMockEndpoint("mock:result");
    

    解决这个问题。

  2. 然后我读到我必须重写 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/

相关文章:

apache-camel - Apache Camel : Unable to get the Exception Body

java - 如何计算(并指定)java进程允许的总内存空间?

java - 如何从 java 程序运行 Linux 终端命令

node.js - Geddy 单元测试 Controller

unit-testing - 如何使用 Selenium 连续运行单个测试用例?

python - 在多个数据集上运行相同的测试

apache-camel - Apache Camel 可以用作通用负载均衡器吗

java - Apache Camel Spring Ws 配置中的 PropertyAccessException

java - 如何正确覆盖克隆方法?

java - 屏幕锁定后相机卡住