当前位置: 首页 > 知识库问答 >
问题:

Apache Camel junit测试中的对象结果

朱雅惠
2023-03-14
public class Customer {
    private String firstName;
    private String lastName;
   // getters and setters
    @Override
    public String toString(){
        return firstName +":::" + lastName;
    }
}

测试路线:

public class FileTest4 extends CamelTestSupport {

    @EndpointInject(uri = "direct:teststart")
    private Endpoint start;

    @EndpointInject(uri = "mock:direct:processActs")
    private MockEndpoint processActs;

    @EndpointInject(uri = "mock:direct:write2File")
    private MockEndpoint write2File;

    @EndpointInject(uri = "mock:end")
    private MockEndpoint mockEndResult;

    @Override
    public boolean isUseAdviceWith() {
        return true;
    }

    @Override
    protected RouteBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                from("file:/var/file.log&noop=true").routeId("MY_ROUTE").to("direct:processActs");

                from("direct:processActs").process(exchange -> {
                    List<Customer> customers = new ArrayList<>();
                    customers.add(new Customer("F1", "L1"));
                    customers.add(new Customer("F2", "L2"));
                    customers.add(new Customer("F3", "L3"));
                    exchange.getOut().setBody(customers);
                }).to("direct:write2File");

                from("direct:write2File").split(simple("${body}")).log("Content: ${body}");
            }
        };
    }

    @Override
    protected void doPostSetup() throws Exception {
        context.getRouteDefinition("MY_ROUTE").adviceWith(context, new AdviceWithRouteBuilder() {
            @Override
            public void configure() throws Exception {
                replaceFromWith("direct:teststart");
                weaveAddLast().to("mock:end");
            }
        });
        context.start();
    }

    @Test
    public void testUnmarshal() throws Exception {
        mockEndResult.expectedMessageCount(1);

    // ArrayIndex Exception here exchanges list is empty
        Customer resultCustomer = processActs.getExchanges().get(0).getIn().getBody(Customer.class); 
        assertEquals(resultCustomer.toString(),"F1:::L1"); 

        write2File.expectedBodiesReceived("F1:::L1", "F3:::L3", "F2:::L2");
        template.sendBody("direct:teststart", new File("src/test/resources/test.txt"));
        mockEndResult.assertIsSatisfied();

    }

}

共有1个答案

艾焕
2023-03-14

看起来,在实际发送任何交换之前,您正在检查模拟endpoint。试着将检查移到测试的末尾,例如:

@Test
public void testUnmarshal() throws Exception {
    mockEndResult.expectedMessageCount(1);

    write2File.expectedBodiesReceived("F1:::L1", "F3:::L3", "F2:::L2");
    template.sendBody("direct:teststart", new File("src/test/resources/test.txt"));
    mockEndResult.assertIsSatisfied();

    Customer resultCustomer = processActs.getExchanges().get(0).getIn().getBody(Customer.class); 
    assertEquals(resultCustomer.toString(),"F1:::L1"); 
}

更新

仔细一看,我想你把你的嘲笑弄得乱七八糟的。根据您要检查的断言判断,是否写出了三个客户。然而,您的模拟并没有为此设置。

@Test
public void testUnmarshal() throws Exception {
    mockEndResult.expectedMessageCount(1);

    template.sendBody("direct:teststart", new File("src/test/resources/test.txt"));

    mockEndResult.assertIsSatisfied();

    @SuppressWarnings("unchecked")
    List<Customer> customers = mockEndResult.getExchanges().get(0).getIn().getBody(List.class);
    assertEquals(customers.get(0).toString(), "F1:::L1");
    assertEquals(customers.get(1).toString(), "F2:::L2");
    assertEquals(customers.get(2).toString(), "F3:::L3");
}
@Override
protected void doPostSetup() throws Exception {
    context.getRouteDefinition("MY_ROUTE").adviceWith(context, new AdviceWithRouteBuilder() {
        @Override
        public void configure() throws Exception {
            replaceFromWith("direct:teststart");
        }
    });
    // give direct:write2File the id 'splitter' to be able to advice it
    context.getRouteDefinition("splitter").adviceWith(context, new AdviceWithRouteBuilder() {
        @Override
        public void configure() throws Exception {
            weaveByType(LogDefinition.class).after().to("mock:end");
        }
    });
    context.start();
}

@Test
public void testUnmarshal() throws Exception {
    mockEndResult.expectedMessageCount(3);
    mockEndResult.expectedBodiesReceived("F1:::L1", "F2:::L2", "F3:::L3");

    template.sendBody("direct:teststart", new File("src/test/resources/test.txt"));

    mockEndResult.assertIsSatisfied();
}
 类似资料:
  • 我试图用spock为我的一个方法写一个测试。 方法如下所示- 我还模拟了我将要调用的dao对象: 所以最后到了斯波克夹具上。我已经把冒犯的比较线评论掉了,并在适当的地方做了一个工作。我的问题是--为什么我的“then”块中的第一行会失败?

  • 一旦configure确定了某个特征是否存在,它将如何记录这一信息?这里有四种记录方式: 定义一个C预处理器符号、在输出文件中设置一个变鼠、为将来运行configure而把结果储存到一个缓存文件中, 以及打印一条消息以便让用户知道测试的结果。 定义C预处理器符号 对一个特征的检测的常见回应是定义一个表示测试结果的C预处理器符号。这是通过调用AC—DEFINE 或者AC—DEFINE—UNQUOTE

  • 使用Jest测试深层嵌套属性是否存在的最佳方法是什么。尝试以我想要的特定对象为目标将导致未定义的错误,因为其父对象不存在: 我应该以某种方式将这些连接起来,这样我就可以首先测试对象的存在,然后测试内部对象的存在吗?相当于在if语句中做这样的事情 或者像这样在一个元素上进行多个测试时,是否应该有单独的测试? 我也尝试过: 这有点管用?更好,但是需要我在测试文件中声明这个非常大的对象。这种非常深入的比

  • 对于任何使用jmeter进行api功能测试的人来说,报告并不是很好。有人使用http://extentreports.com/这样的东西来显示他们的测试结果吗?对其他更好地显示测试结果的方法有什么想法吗?在尝试使用一个主要关注性能测试和测试结果的工具时,当我们测试REST API调用和测试结果时,这并不起作用。例如,能够捕获在测试运行期间创建的数据是很好的,但是jmeter中内置的报告都没有做到这

  • 我有一个公司对象与不同的部门和员工。我已经成功地序列化了我的对象,并将它再次加载到我的程序中。 现在我想测试一下这两个对象在结构上是否相等。java是否为我提供了一个比较这些对象的工具? 我应该补充一点,我的对象有一个用其他对象填充的列表。 还是我必须为此编写自己的测试? 编辑: 现在我想比较一下t和t1,如果它们的值相同的话。

  • 我有以下两门课 我想对SampleTest getResult()进行单元测试,但我想在这里模拟Test1(),这样我就可以返回我在UnitTests中设置的任何值。这些课我都改不了。 我使用Mockito尝试了一些模式,但没有成功。 请提出一些好的建议。