簡體   English   中英

Apache Camel junit測試中的對象結果

[英]Object result in Apache Camel junit test

我試圖將駱駝輸出作為對象進行測試,但無法獲取交換對象。這是失敗的地方Customer resultCustomer = processActs.getExchanges().get(0).getIn().getBody(Customer.class) 請幫我解決這個問題。我引用了這種正確的方法來在駱駝中測試我的對象

客戶POJO:

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();

    }

}

看起來您在實際發送任何交換之前正在檢查模擬端點。 嘗試將支票移至測試結束,例如:

@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"); 
}

UPDATE

經過仔細檢查,我認為您的模擬結果混亂了。 根據斷言來判斷是否要注銷三個客戶。 但是,尚未為此設置模擬程序。

mock:end被添加到MY_ROUTE的末尾,但是只會direct:processActs在處理過程中看到處理器返回的整個客戶列表direct:processActs

另外,使用@EndpointInject聲明的@EndpointInject也不會參與該路由,因為您實際上並未模擬真實的端點。 您可以刪除所有對象,而不是mockEndResult

以下測試通過了。

@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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM