Java 测试Apache Camel Junit的所有进程和路由

Java 测试Apache Camel Junit的所有进程和路由,java,junit,apache-camel,Java,Junit,Apache Camel,我正在尝试验证路由的所有进程,但在它开始中断后,start工作正常。请为此给我一些有用的参考或示例。提前感谢 test.txt: F1:L1 F2:L2 F3:L3 public class FileTest7 extends CamelTestSupport { @EndpointInject(uri = "direct:teststart") private Endpoint start; @EndpointInject(uri

我正在尝试验证路由的所有进程,但在它开始中断后,start工作正常。请为此给我一些有用的参考或示例。提前感谢

test.txt:

F1:L1
F2:L2
F3:L3
    public class FileTest7 extends CamelTestSupport {

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

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

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

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

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

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

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

                    from("direct:process1").routeId("process1").process(exchange -> {
                        File file = exchange.getIn().getBody(File.class);
                        FileInputStream fis = new FileInputStream(file);
                        BufferedReader br = new BufferedReader(new InputStreamReader(fis));
                        List<Customer> customers = new ArrayList<>();

                        String line = null;
                        while ((line = br.readLine()) != null) {
                            String[] names = line.split(",");
                            customers.add(new Customer(names[0], names[1]));
                        }
                        br.close();
                        exchange.getOut().setBody(customers);
                    }).to("direct:process2");

                    from("direct:process2").routeId("process2").split(simple("${body}")).to("direct:process3");

                    from("direct:process3").routeId("process3").process(exchange -> {
                        Customer customer = exchange.getIn().getBody(Customer.class);
                        String content = "Content:" + customer.toString();
                        exchange.getIn().setBody(content);
                    }).to("direct:write2File");

                    //Below updated
from("direct:write2File").routeId("write2File").to("file:/src/test/resources?fileName=test_out.log&fileExist=Append");

                }
            };
        }

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

        @Test
        public void testUnmarshal() throws Exception {

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


            List<Customer> customers = mockProcess1.getExchanges().get(0).getIn().getBody(List.class);
            System.out.println("customers:"+customers.size());

            Customer customer1 = mockProcess2.getExchanges().get(0).getIn().getBody(Customer.class);
            System.out.println("customer1:"+customers.toString());


            String customer = mockProcess3.getExchanges().get(0).getIn().getBody(String.class);
            System.out.println("customer:"+customer);

            String customerString = mockWrite2File.getExchanges().get(0).getIn().getBody(String.class);
            System.out.println("Customer String:"+customerString);

            String customerFinal =  mockEnd.getExchanges().get(0).getIn().getBody(String.class);
            System.out.println("Customer String:"+customerFinal);


            assertMockEndpointsSatisfied();
        }

    }
Customer.java

    private String firstName;
    private String lastName;
    // getters and setters
    @Override
    public String toString(){
        return firstName +":::" + lastName;
    }
}
JUnit和路由:

F1:L1
F2:L2
F3:L3
    public class FileTest7 extends CamelTestSupport {

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

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

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

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

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

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

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

                    from("direct:process1").routeId("process1").process(exchange -> {
                        File file = exchange.getIn().getBody(File.class);
                        FileInputStream fis = new FileInputStream(file);
                        BufferedReader br = new BufferedReader(new InputStreamReader(fis));
                        List<Customer> customers = new ArrayList<>();

                        String line = null;
                        while ((line = br.readLine()) != null) {
                            String[] names = line.split(",");
                            customers.add(new Customer(names[0], names[1]));
                        }
                        br.close();
                        exchange.getOut().setBody(customers);
                    }).to("direct:process2");

                    from("direct:process2").routeId("process2").split(simple("${body}")).to("direct:process3");

                    from("direct:process3").routeId("process3").process(exchange -> {
                        Customer customer = exchange.getIn().getBody(Customer.class);
                        String content = "Content:" + customer.toString();
                        exchange.getIn().setBody(content);
                    }).to("direct:write2File");

                    //Below updated
from("direct:write2File").routeId("write2File").to("file:/src/test/resources?fileName=test_out.log&fileExist=Append");

                }
            };
        }

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

        @Test
        public void testUnmarshal() throws Exception {

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


            List<Customer> customers = mockProcess1.getExchanges().get(0).getIn().getBody(List.class);
            System.out.println("customers:"+customers.size());

            Customer customer1 = mockProcess2.getExchanges().get(0).getIn().getBody(Customer.class);
            System.out.println("customer1:"+customers.toString());


            String customer = mockProcess3.getExchanges().get(0).getIn().getBody(String.class);
            System.out.println("customer:"+customer);

            String customerString = mockWrite2File.getExchanges().get(0).getIn().getBody(String.class);
            System.out.println("Customer String:"+customerString);

            String customerFinal =  mockEnd.getExchanges().get(0).getIn().getBody(String.class);
            System.out.println("Customer String:"+customerFinal);


            assertMockEndpointsSatisfied();
        }

    }
公共类FileTest7扩展了CamelTestSupport{
@端点注入(uri=“direct:teststart”)
私有端点启动;
@端点注入(uri=“mock:direct:process1”)
私有mockpoint mockProcess1;
@端点注入(uri=“mock:direct:process2”)
私有mockpoint mockProcess2;
@端点注入(uri=“mock:direct:process3”)
私有模拟端点模拟过程3;
@端点注入(uri=“mock:direct:write2File”)
私有MockEndpoint MockWrite2文件;
@端点注入(uri=“mock:end”)
私有mockEnd;
@凌驾
公共布尔值isUseAdviceWith(){
返回true;
}
@凌驾
受保护的RouteBuilder createRouteBuilder()引发异常{
返回新的RouteBuilder(){
@凌驾
public void configure()引发异常{
从(“file:/var/file.log&noop=true”).routeId(“MY_ROUTE”)到(“direct:process1”);
from(“direct:process1”).routeId(“process1”).process(交换->{
File File=exchange.getIn().getBody(File.class);
FileInputStream fis=新的FileInputStream(文件);
BufferedReader br=新的BufferedReader(新的InputStreamReader(fis));
列出客户=新建ArrayList();
字符串行=null;
而((line=br.readLine())!=null){
String[]name=line.split(“,”);
添加(新客户(名称[0],名称[1]);
}
br.close();
exchange.getOut().setBody(客户);
})。至(“直接:流程2”);
从(“direct:process2”).routeId(“process2”).split(简单(${body}”))到(“direct:process3”);
from(“direct:process3”).routeId(“process3”).process(交换->{
Customer=exchange.getIn().getBody(Customer.class);
String content=“content:+customer.toString();
exchange.getIn().setBody(内容);
}).to(“直接:写入文件”);
//以下更新
从(“direct:write2File”).routeId(“write2File”).to(“file:/src/test/resources?fileName=test_out.log&fileExist=Append”);
}
};
}
@凌驾
受保护的void doPostSetup()引发异常{
context.getRouteDefinition(“我的路线”).adviceWith(context,newadviceWithRouteBuilder(){
@凌驾
public void configure()引发异常{
替换为(“直接:测试开始”);
weaveAddLast().to(“mock:end”);
}
});
context.start();//已更新
}
@试验
public void testUnmarshal()引发异常{
sendBody(“direct:teststart”,新文件(“src/test/resources/test.txt”);
List customers=mockProcess1.getExchanges().get(0.getIn().getBody(List.class);
System.out.println(“customers:+customers.size());
Customer customer1=mockProcess2.getExchanges().get(0.getIn().getBody(Customer.class);
System.out.println(“customer1:+customers.toString());
字符串customer=mockProcess3.getExchanges().get(0.getIn().getBody(String.class));
System.out.println(“客户:+customer”);
字符串customerString=mockWrite2File.getExchanges().get(0.getIn().getBody(String.class));
System.out.println(“客户字符串:“+customerString”);
字符串customerFinal=mockEnd.getExchanges().get(0.getIn().getBody(String.class));
System.out.println(“客户字符串:+customerFinal”);
AssertMockEndpointsAssertified();
}
}
异常:已更新

原因:java.lang.ArrayIndexOutOfBoundsException:1 位于com.tgt.frs.collections.trm.ceds.routes.FileTest7$1.lambda$0(FileTest7.java:61) 位于org.apache.camel.processor.DelegateSyncProcessor.process(DelegateSyncProcessor.java:63) 位于org.apache.camel.processor.RedeliveryRorHandler.process(RedeliveryRorHandler.java:541) 位于org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198) 位于org.apache.camel.processor.Pipeline.process(Pipeline.java:120) 位于org.apache.camel.processor.Pipeline.process(Pipeline.java:83) 位于org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198) 位于org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:62)
在org.apache.camel.processor.SendProcessor.process(SendProcessor.java:145)

上,测试框架不会自动启动
CamelContext
,因为您正在使用
AdviceWith
,以允许您在路由启动之前向路由添加建议。添加建议后,在
doPostSetup
末尾添加对
startCamelContext()
的调用

另外,
append
似乎不是
文件
组件的有效属性,因此您需要删除
append=true

正确的解决方案是,但此测试回避了一个问题,即此处实际测试的是什么。你在模拟你的路线,有效地,你只是在真正测试处理器。最好是单独测试处理器,而不是嵌入到这样的路径中(如果没有其他方法的话),以实现