Тестирование верблюдов - Как протестировать процессор из FileConsumer/FTPConsumer?

У меня есть верблюжий маршрут, который опрашивает файлы с ftp-сервера и отправляет файлы на s3. У меня есть несколько процессоров в маршруте, который вычисляет / манипулирует заголовками на основе имени файла. Мне нужно проверить этот маршрут. Как я могу внедрить свой процессор и использовать язык файлов внутри моего процессора?

@RunWith(MockitoJUnitRunner.class)
public class CamelS3HeadersProcessorTest extends CamelTestSupport {
  private String filePath = "src/test/resources/sample.txt";

 // @Autowired
//  private CamelS3HeadersProcessor camelS3HeadersProcessor;

  @Test
  public void shouldSetS3HeadersProperly() throws Exception {
    File file = new File(filePath);
    template.sendBody("direct:start", file);
    getMockEndpoint("mock:result").expectedMessageCount(1);
    getMockEndpoint("mock:result").expectedHeaderReceived(S3Constants.KEY, file.getName());
    assertMockEndpointsSatisfied();
  }

  @Override
  protected RouteBuilder createRouteBuilder() throws Exception {
    return new RouteBuilder() {
        @Override
        public void configure() throws Exception {
            from("direct:start").process(new CamelS3HeadersProcessor()).to("mock:result");
        }
    };
  }
}

Процессор:

@Component
public class CamelS3HeadersProcessor implements Processor {
  @Override
  public void process(Exchange exchange) throws Exception {
    SimpleBuilder simpleBuilder = new SimpleBuilder("${file:name}");
    String fileName = simpleBuilder.evaluate(exchange, String.class);
    //do some logic and set headers
  }
}

Я не хочу издеваться над моим процессором. Я хочу издеваться над своими конечными точками и тестировать мой процессор.

Проблемы:

  1. Не удается автоматически подключить / ввести мой процессор.

  2. Имя файла было оценено как ноль. Как использовать FileConsumer/FTPConsumer вместо ProducerTemplate?

2 ответа

Я думаю, что в createRouteBuilder у вас будет только CamelContext, а не ApplicationContext. Вы можете построить маршрут в тесте или в методе @Before.

У меня это сработало так:

@SpringBootTest
@EnableAutoConfiguration
@RunWith(CamelSpringRunner.class)
public class MyProcessorTest extends AbstractJUnit4SpringContextTests {

  @Autowired
  private CamelContext camelContext;

  @Autowired
  private MyProcessor myProcessor;

  @EndpointInject(uri = "mock:result")
  private MockEndpoint resultEndpoint;

  @Produce(uri = "direct:start")
  private ProducerTemplate template;

  @Before
  public void setUp() throws Exception {
    camelContext.addRoutes(new RouteBuilder() {
      @Override
      public void configure() throws Exception {
        from("direct:start").process(myProcessor).to("mock:result");
      }
    });
    camelContext.start();
  }

  @DirtiesContext
  @Test
  public void test1() throws Exception {
    resultEndpoint.expectedMessageCount(1);
    String myProcessorInput = "test"; // or Object
    template.sendBody(myProcessorInput);

    resultEndpoint.assertIsSatisfied();

    // or other result Type
    String body = (String)resultEndpoint.getExchanges().get(0).getIn().getBody(String.class);

    assertNotNull(body);
    // tests
  }

  @DirtiesContext
  @Test
  public void test2() throws Exception {
  }
}

В рабочем коде ваш RouteBuilder будет создан за пределами теста, поэтому он может внедрить выбранного вами производителя, например

@Component
class MyRouteBuilder extends RouteBuilder {

    private Processor processor;

    @Autowired
    public MyRouteBuilder(Processor pProcessor) {
        processor = pProcessor;
    }

    @Override
    public void configure() {
        from("direct:start").process(processor);
    }
}

Затем в своем тесте вы можете указать, какой процессор (по ошибке или нет) вам нужен:

public class MyTest extends CamelTestSupport {

    private Processor processor;

    @Override
    protected RoutesBuilder createRouteBuilder() {
        return new MyRouteBuilder(processor);
    }

}

(Обратите внимание, что я удалил фиктивную конечную точку из маршрута: см. Эту проблему. Как проверить верблюжий маршрут без изменения производственного кода? Как выполнить тестирование без него.)

Другие вопросы по тегам