使用camel测试支持对camel路由进行单元测试

whhtz7ly  于 2022-11-07  发布在  Apache
关注(0)|答案(1)|浏览(226)

我想正确的单元和集成测试用例来测试所有的功能流。有人可以分享你的想法,我可以如何创建一个模拟端点来监视目录的文件创建,并进一步处理他们通过多个路线,并将文件移动到不同的目录。
1.监视/hello目录以创建新文件。
1.如果存在基于文件前缀的文件,则使用容器名称更新标头。
1.根据文件名上载到相应的Azure Blob容器。
1.进行API调用,并在处理后将文件移动到/success目录。

文件观察器路由.java

@Service
public class FileWatcherRoute extends RouteBuilder {

  @Value("${watcher-base-url}")
  private String baseUrl;

  @Value("${watcher-subscription-key}")
  private String subscriptionKey;

  @Override
  public void configure() {

    Processor logResponse = exchange -> log
        .info("The response code is: {}", exchange.getIn().getHeader(Exchange.HTTP_RESPONSE_CODE));

    from("file-watch:hello?events=CREATE&antInclude=**/*.csv&recursive=true")
        .routeId("fileWatch")
        .to("direct:updateHeaders")
        .end();

    from("direct:updateHeaders")
        .routeId("updateHeaders")
        .choice()

            .when((exchange -> exchange.getIn().getHeader(Exchange.FILE_NAME).toString().trim().matches("\\d{8}_\\d{4}(_Inventory.csv)")))
            .setHeader("CamelAzureStorageBlobContainerName", constant(AppConstants.STORE))

                        .when(exchange -> exchange.getIn().getHeader(Exchange.FILE_NAME).toString().trim().matches("\\d{8}-\\d{6}_Idle_Inventory_\\d{4}.csv"))
            .setHeader("CamelAzureStorageBlobContainerName",constant(AppConstants.IDLE_FILE))

        .toD("direct:uploadFileToBlob")
        .end();

    from("direct:uploadFileToBlob")
        .routeId("uploadFile")
        .log("Container Name: ${header.CamelAzureStorageBlobContainerName}")
        .toD("azure-storage-blob://{accName}/${header.CamelAzureStorageBlobContainerName}?blobName=${header.CamelFileName}&operation=uploadBlockBlob&serviceClient=#serviceClient")
        .to("direct:startRestApi")
        .log("${header.CamelFileName} Uploaded to ${header.CamelAzureStorageBlobContainerName} Container Successfully")
        .end();

    from("direct:startRestApi")
        .routeId("restCall")
        .setHeader(Exchange.HTTP_METHOD, constant("GET"))
        .setHeader("Content-Type",constant("application/json"))
        .setHeader("Ocp-Apim-Subscription-Key",constant(subscriptionKey))
        .to(baseUrl)
        .to("direct:processedFiles")
        .process(logResponse)
        .end();

    from("direct:processedFiles")
        .routeId("fileProcessing")
        .choice()
        .when(exchange -> exchange.getIn().getHeader(Exchange.HTTP_RESPONSE_CODE).equals(200))
        .to("file://success")
        .otherwise()
        .to("file://error")
        .end();
  }
}

文件观察器路由测试.java

@CamelSpringBootTest
@SpringBootTest
@MockEndpoints
@UseAdviceWith
public class FileWatcherRouteTest {

  @Autowired
  CamelContext camelContext;

  @Autowired
  ProducerTemplate producerTemplate;

  @EndpointInject("mock:processedFiles")
  MockEndpoint mockEndpoint;

  @Test
  void when_new_file_created_should_update_header_with_container_name_and_upload_to_container() throws Exception {

    AdviceWith.adviceWith(camelContext, "fileWatch", routeBuilder -> {
      routeBuilder.replaceFromWith("direct:file-watch");
    });

    camelContext.start();
    mockEndpoint.assertIsSatisfied();

  }

}
tnkciper

tnkciper1#

MockEndpoint仅支持生成器终结点。这是因为它被设计为执行对Exchange和消息的Assert。

例如:

  • 给定的MockEndpoint是否接收正确数量的消息
  • 消息正文是否与预期内容匹配。
  • 如果提供给MockEndpoint的所需标头

测试路由时,您应该使用ProducerTemplate send方法来启动测试中的路由,并使用您想要测试的任何主体、标头和属性。
在您的情况下,您可以使用java文件操作从测试资源文件夹中读取一个文件作为字符串、字节数组或流,并使用将其作为正文沿着标题CamelFileNameCamelFileEventType发送到目标路由。
我还建议将您的直接路由视为函数,以使它们更容易测试。这意味着,您可以使用只按正确顺序调用子路由的父路由,而不是从一个路由跳到另一个路由。

from("file-watch:hello?events=CREATE&antInclude=**/*.csv&recursive=true")
    .routeId("fileWatch")
    .to("direct:processNewFile")

// "Parent route"
from("direct:processNewFile")
    .routeId("processCreatedFile")
    .to("direct:updateHeaders")
    .to("direct:uploadFileToBlob")
    .to("direct:processedFiles")

这使您可以轻松地为direct:updateHeadersdirect:uploadFileToBlobdirect:processedFiles编写单独的测试

例如:

  • 测试direct:uploadFileToBlob是否会在其中一个必要的信头遗失或无效时掷回适当的例外状况。
  • 测试direct:uploadFileToBlob是否正确处理与azure的连接异常。
  • 测试direct:processedFiles是否将文件放置到正确的文件夹。

如果要测试文件输出,可以使用JUnits TemporaryFolder创建临时文件夹,然后将其作为文件生成器端点的目标。完成路由后,可以使用基本的assertEquals和文件操作来检查输出是否满足测试要求。
Apache Commons IO对于从资源阅读文件和将文件复制到TemporaryFolder的测试来说也是非常方便的库。

结合文件示例、ProducerTemplate、Commons IO和CamelTestSupport:

第一个
3.4.4以上使用Camel的示例

相关问题