Java 在Camel中测试对象的正确方法

Java 在Camel中测试对象的正确方法,java,junit,apache-camel,Java,Junit,Apache Camel,我正试着设置骆驼路线的测试。我的测试路由读取一个二进制文件并将其发送到翻译bean,返回一个POJO。现在,我想对POJO进行一些断言,以确保存在的值与已知值匹配。我想是标准的东西。在我看到的示例中,主体似乎总是字符串或基本类型,可以对其进行简单的断言。然而,在我的例子中,它是一个对象,所以我想以某种方式得到这个对象 以下是我迄今为止所尝试的: @Override protected RouteBuilder createRouteBuilder() throws Exception {

我正试着设置骆驼路线的测试。我的测试路由读取一个二进制文件并将其发送到翻译bean,返回一个POJO。现在,我想对POJO进行一些断言,以确保存在的值与已知值匹配。我想是标准的东西。在我看到的示例中,主体似乎总是字符串或基本类型,可以对其进行简单的断言。然而,在我的例子中,它是一个对象,所以我想以某种方式得到这个对象

以下是我迄今为止所尝试的:

@Override
protected RouteBuilder createRouteBuilder() throws Exception {
    return new RouteBuilder() {
        @Override
        public void configure() throws Exception {
            from("file:///path/to/dir/of/test/file/?noop=true")
            .bean(TranslatorBean.class)
            .to("mock:test").end();
        }
    };
}

@Test
public void testReadMessage() throws Exception {

    MockEndpoint endpoint = getMockEndpoint("mock:test");

    endpoint.whenAnyExchangeReceived(new Processor() {      
        @Override
        public void process(Exchange exchange) throws Exception {           
            Object body = exchange.getIn().getBody();

            assertIsInstanceOf(MyPOJO.class, body);

            MyPOJO message = (MyPOJO) body;

            assertEquals("Some Field", someValue, message.getSomeField());

            // etc., etc.

        }           
    });


    //If I don't put some sleep here it ends before anything happens
    Thread.sleep(2000);

}
当我运行它时,它似乎运行正确,但当我逐步执行时,我可以看到断言失败。由于某些原因,这没有得到报告

因此,我尝试将处理器内联到以下路径:

public void configure() throws Exception {
    .from("file:///path/to/dir/of/test/file/?noop=true")
    .bean(TranslatorBean.class)
    .process(new Processor() {
        //same code as before
     });
}

这种方法可行,但有一个很大的问题。JUnit仍然不会报告任何失败的断言。相反,他们被骆驼抓住,并被报告为骆驼执行例外,完全没有关于原因的信息。只有单步执行调试器,才能确定哪个断言失败。同样,通过这种方式,我的整个测试都在configure方法中,而不是在它自己的测试方法中。我必须包括一个带有睡眠的空测试才能运行它。显然这很糟糕,但我确信在这里做正确的事情。看起来处理器可能不是正确的路径,但我没有看到正确的路径。非常感谢您的指导。

我建议您开始阅读Apache Camel文档。在用户指南中,有一个指向testing的链接,其中包含大量信息。此外,由于您使用模拟端点,请阅读以下内容:

例如,您拥有的模拟代码可以按如下方式完成

MockEndpoint endpoint = getMockEndpoint("mock:test");
mock.allMessages().body().isInstanceOf(MyPojo.class)
尽管人们经常在模拟端点上使用示例方法等 例如,如果您希望收到两条消息,并且它们的正文顺序如下:

MockEndpoint mock = getMockEndpoint("mock:result");
mock.expectedBodiesReceived("Hello World", "Bye World");
但是请查看模拟和测试文档以了解更多信息


如果您有一本Camel in Action手册,那么请阅读第6章,这是关于使用Camel进行测试的所有内容。

我建议您开始阅读Apache Camel文档。在用户指南中,有一个指向testing的链接,其中包含大量信息。此外,由于您使用模拟端点,请阅读以下内容:

例如,您拥有的模拟代码可以按如下方式完成

MockEndpoint endpoint = getMockEndpoint("mock:test");
mock.allMessages().body().isInstanceOf(MyPojo.class)
尽管人们经常在模拟端点上使用示例方法等 例如,如果您希望收到两条消息,并且它们的正文顺序如下:

MockEndpoint mock = getMockEndpoint("mock:result");
mock.expectedBodiesReceived("Hello World", "Bye World");
但是请查看模拟和测试文档以了解更多信息


如果您有一本Camel in Action book的副本,那么请阅读第6章,这是关于使用Camel进行测试的所有内容。

如果您正在寻找一种方法来检索对象本身并对其执行断言,您需要如下内容:

Product resultProduct = resultEndpoint.getExchanges().get(0).getIn().getBody(Product.class);
assertEquals(expectedEANCode, resultProduct.getEANCode());

其中,
resultEndPoint
是模拟端点。

如果您正在寻找一种方法来检索对象本身并对其执行断言,则需要类似以下内容:

Product resultProduct = resultEndpoint.getExchanges().get(0).getIn().getBody(Product.class);
assertEquals(expectedEANCode, resultProduct.getEANCode());

其中,
resultEndPoint
是模拟端点。

你好,克劳斯,非常感谢您的回复。我读了很多你的书(老实说,我认为这是我读过的学习新技术的最好的书之一),以及在线文档。测试主体的示例似乎都类似于您刚才给出的“Hello World”、“Bye World”示例,其中主体只是一个字符串,因此对主体作为一个整体进行预期/断言是有意义的。然而,我的消息体是一个对象,我需要做更多的测试。是否没有办法获取消息正文并测试其某些字段?图辛德!你好,克劳斯,非常感谢你的回复。我读了很多你的书(老实说,我认为这是我读过的学习新技术的最好的书之一),以及在线文档。测试主体的示例似乎都类似于您刚才给出的“Hello World”、“Bye World”示例,其中主体只是一个字符串,因此对主体作为一个整体进行预期/断言是有意义的。然而,我的消息体是一个对象,我需要做更多的测试。是否没有办法获取消息正文并测试其某些字段?图辛德!