我正在尝试用Apache Camel编写我的第一个代码。我尝试按照Camel in Action中的示例进行操作,但我想使用自己的示例数据。
现在我想从CSV文件中读取并将每一行作为java bean。
这是我的junit测试:
@Test
public void testCsvWithBindy() throws Exception {
MockEndpoint mock = getMockEndpoint("mock:queue.csv");
mock.expectedMessageCount(2);
assertMockEndpointsSatisfied();
CsvBean line1 = mock.getReceivedExchanges().get(0).getIn()
.getBody(CsvBean.class);
assertEquals("row 01", line1.getFirst());
}
public RouteBuilder createRoute() {
return new RouteBuilder() {
public void configure() throws Exception {
context.setTracing(true);
from("file://src/test/resources?noop=true&fileName=test.csv")
.unmarshal().bindy(BindyType.Csv, "my.package.for.csvrecord")
.to("mock:queue.csv");
}
};
}
CSV包含以下内容:
row 01,row 02,,row 04
row 11, row 12, row 13, row 14
这是我的CsvRecord:
@CsvRecord(separator = ",")
public class CsvBean {
@DataField(pos = 1)
private String first;
@DataField(pos = 2)
private String second;
@DataField(pos = 3)
private String third;
@DataField(pos = 4)
private String fourth;
public String getFirst() {
return first;
}
public void setFirst(String first) {
this.first = first;
}
public String getSecond() {
return second;
}
public void setSecond(String second) {
this.second = second;
}
public String getThird() {
return third;
}
public void setThird(String third) {
this.third = third;
}
public String getFourth() {
return fourth;
}
public void setFourth(String fourth) {
this.fourth = fourth;
}
}
当我运行此测试时,将启动上下文并加载路径。但没有任何事情发生。大约10秒后,上下文自动停止,我的测试失败。这是堆栈跟踪:
java.lang.AssertionError: mock://queue.csv Received message count. Expected: <2> but was: <0>
at org.apache.camel.component.mock.MockEndpoint.fail(MockEndpoint.java:1086)
at org.apache.camel.component.mock.MockEndpoint.assertEquals(MockEndpoint.java:1068)
at org.apache.camel.component.mock.MockEndpoint.doAssertIsSatisfied(MockEndpoint.java:367)
at org.apache.camel.component.mock.MockEndpoint.assertIsSatisfied(MockEndpoint.java:346)
at org.apache.camel.component.mock.MockEndpoint.assertIsSatisfied(MockEndpoint.java:334)
at org.apache.camel.component.mock.MockEndpoint.assertIsSatisfied(MockEndpoint.java:172)
at org.apache.camel.test.junit4.CamelTestSupport.assertMockEndpointsSatisfied(CamelTestSupport.java:391)
at my.package.for.unittests.CsvToBeanWithBindyTest.testCsvWithBindy(CsvToBeanWithBindyTest.java:20)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
我想我错过了一些明显的东西,可能与测试设置有关,而不是我的CsvRecord或我的路线。你能给我一个提示或者一个更好的教程的URL吗?这本书在这一点上不是很有用......: - (
答案 0 :(得分:3)
再次,在发布我的问题之后,我自己找到了答案。 ;-)这是一个有效的junit测试:
public class CsvToBeanWithBindyTest extends CamelTestSupport {
@Test
public void testCsv() throws Exception {
MockEndpoint mock = getMockEndpoint("mock:queue.csv");
mock.expectedMessageCount(1);
assertMockEndpointsSatisfied();
List line1 = (List) mock.getReceivedExchanges().get(0).getIn()
.getBody();
Map map1 = (Map) line1.get(0);
CsvBean csv1 = (CsvBean) map1.get("my.package.CsvBean");
assertEquals("row 01", csv1.getFirst());
Map map2 = (Map) line1.get(1);
CsvBean csv2 = (CsvBean) map2.get("my.package.CsvBean");
assertEquals("row 11", csv2.getFirst());
}
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
context.setTracing(true);
from("file://src/test/resources?noop=true&fileName=test.csv")
.unmarshal(new BindyCsvDataFormat("my.package"))
.to("mock:queue.csv");
}
};
}
}
对我来说意想不到的事情是我从我的终端路线获得List
,而后者又拥有许多Map
s。每张地图都有一个键my.package.MyBeanClass
,其值设置为我的CSV文件中的实际未编组行。