Как демонтировать из CSV в Боб с Apache Camel и Bindy? - PullRequest
1 голос
/ 23 июня 2011

Я пытаюсь написать свой первый код с Apache Camel прямо сейчас. Я пытаюсь следовать примерам Верблюд в действии , но я хочу использовать свои собственные данные примеров.

Что я хочу сделать

Сейчас я хочу прочитать из CSV-файла и получить каждую строку в виде Java-бина.

Вот мой джунит-тест:

@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 для лучшего учебника? На данный момент книга не очень полезна ...: - (

1 Ответ

3 голосов
/ 23 июня 2011

Опять же, сразу после публикации моего вопроса, я нашел ответ сам.;-) Вот рабочий тест 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 с.Каждая карта имеет ключ my.package.MyBeanClass со значением, установленным для фактической неархивированной строки из моего файла CSV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...