#junit #apache-camel #dsl #camel-http
#junit #apache-camel #dsl #camel-http
Вопрос:
Я довольно новичок в Camel, и мне только что удалось реализовать вариант использования, как показано ниже, с 2 маршрутами, в которых используются файловые и http-компоненты. Ищу некоторые рекомендации по написанию junits для того же. Попробовал несколько примеров тестов, приведенных ниже, на основе входных данных, которые я нашел в сети. Не уверен, достаточно ли этого. Ценю вашу помощь!
- Реализация:
@Override public void configure() throws Exception { // Global Exception Handling block onException(FileWatcherException.class).process(new Processor() { public void process(Exchange exchange) throws Exception { System.out.println("Exception handled"); } }).to("file:C:/error?recursive=true").handled(true); // Actively listen to the input folder for an incoming file from("file:C:/input?noop=trueamp;recursive=trueamp;delete=true") .process(new Processor() { public void process(Exchange exchange) throws Exception { String fileName = exchange.getIn().getHeader("CamelFileName").toString(); exchange.getIn().setHeader("fileName", fileName); } }) // Call the Get endpoint with fileName as input parameter .setHeader(Exchange.HTTP_METHOD, simple("GET")) .toD("http://localhost:8090/fileWatcher?fileName=${header.fileName}") .choice() // if the API returns true, move the file to the outbox folder .when(header(Exchange.HTTP_RESPONSE_CODE).isEqualTo(constant(200))) .to("file:C:/outbox?noop=trueamp;recursive=true") .endChoice() // If the API's response code is other than 200, move the file to error folder .otherwise() .log("Moving the file to error folder") .to("file:C:/error?recursive=true") .end(); // Listen to the outbox folder for file arrival after it gets moved in the above step from("file:C:/outbox?noop=trueamp;recursive=true") // Request Body for POST call is set in FileDetailsProcessor class .process(new FileDetailsProcessor()) .marshal(jsonDataFormat) .setHeader(Exchange.HTTP_METHOD, simple("POST")) .setHeader(Exchange.CONTENT_TYPE, constant("application/json")) // Call the Rest endpoint with fileName amp; filePath as RequestBody .to("http://localhost:8090/fileWatcher") .process(new MyProcessor()) .end(); }
- Junit
@Test public void checkFileWatcherFunctionality() throws Exception { context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() { @Override public void configure() throws Exception { // mocking all endpoints. **QUESTION** - Is this required? mockEndpointsAndSkip("http://localhost:8090:fileWatcher?fileName=loan.csv"); mockEndpointsAndSkip("file:C:/processing"); mockEndpointsAndSkip("file:C:/error"); mockEndpointsAndSkip("http://localhost:8090:fileWatcher"); } }); context.start(); // **QUESTION** - This is a GET call. Expecting only the HTTP status code from it. How to check that? getMockEndpoint("mock:http://localhost:8090:fileWatcher?fileName=abc.txt").expectedBodyReceived(); // **QUESTION** - This is a POST call. How to send request body along? Expecting only the HTTP status code from it. How to check that? getMockEndpoint("mock:http://localhost:8090:fileWatcher").expectedBodyReceived(); // **QUESTION** - Is this the right way to check? getMockEndpoint("mock:file:C:/processing").expectedFileExists("loan.csv");; template.sendBodyAndHeader("file:C:/inbound", "", Exchange.FILE_NAME, "loan.csv"); // QUESTION - What can be asserted now?
}
Также — Как написать тестовые примеры для отрицательного потока (сценарий исключения)? Ищу предложения.
Ответ №1:
Мне удалось составить тестовый пример. Это правильный подход или может быть лучший способ? Я полагаю, это может быть скорее интеграционный тест.
Проблема, которую я вижу сейчас, заключается в том, что тестовый пример не сообщает в конце (успех или неудача), вместо этого он продолжает ожидать поступления файла во входную папку. Чего мне не хватает?
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class FileWatcherRouteBuilderTest extends CamelTestSupport {
@Autowired
private TestRestTemplate restTemplate;
@Override
public RoutesBuilder createRouteBuilder() throws Exception {
return new FileWatcherRouteBuilder();
}
@Test
public void testFileCopy() throws Exception {
template.sendBodyAndHeader("file:C:/inbound", "", Exchange.FILE_NAME, "abc.csv");
// Call the GET endpoint
ResponseEntity<String> getResponse = restTemplate.getForEntity("http:localhost:8090/fileWatcher?fileName=abc.csv",
String.class);
assertTrue("Get call is unsuccessful", getResponse.getStatusCode().is2xxSuccessful());
String response = getResponse.getBody();
assertTrue(!response.isEmpty());
// The file would have moved to output folder now.
File targetFile = new File("C:/processing");
assertTrue(targetFile.isDirectory());
assertEquals(1, targetFile.listFiles().length);
// Since we need to extract the file name, doing the below step
Exchange exchange = consumer.receive("file:C:/processing");
String fileName = exchange.getIn().getHeader("CamleFileName").toString();
// RequestBody needed for POST call
FileDetails fileDetails = new FileDetails(fileName, "C:/processing/" fileName);
HttpHeaders headers = new HttpHeaders();
HttpEntity<FileDetails> request = new HttpEntity<FileDetails>(fileDetails, headers);
// Call the POST endpoint
ResponseEntity<String> postResponse = restTemplate.postForEntity("http://localhost:8090/fileWatcher", request, String.class);
assertTrue("Post call is unsuccessful", postResponse.getStatusCode().is2xxSuccessful());
// Asserting that after both the web service calls, the file is still available in the output folder
assertEquals(1, targetFile.listFiles().length);
}
}