ApacheCamel:文件和http组件的单元测试



我对Camel&只是设法实现了一个用例,如下所示,有两个路由,使用文件&http组件。寻找一些线索写同样的青少年。根据我在网上找到的输入,我尝试了下面的一些示例测试用例。不确定这是否足够。感谢你的帮助!

  • 实现:

    @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=true&recursive=true&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=true&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=true&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 & 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?
    

    }

还有-如何为负流编写测试用例(异常场景(?寻求建议。

我已经起草了测试用例。这是正确的方法吗?还是有更好的方法?我想这可能更像是一个集成测试。

我现在看到的问题是,测试用例最终不会报告(成功或失败(,而是一直在等待文件到达输入文件夹。我错过了什么?

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

最新更新