camel azure blob 容器的单元测试用例

Unit test cases for camel azure blob container

我有路由,它只会获取文件并将其上传到 blob 容器。有人可以用不同的方式帮助我为这条路线编写单元测试吗?

  from("direct:uploadFileToBlob")
        .routeId("uploadFile")
        .setHeader("CamelAzureStorageBlobSourceBlobAccountName",constant(storageAccountName))
        .log(LoggingLevel.INFO,"Connecting To Container Name: ${header.CamelAzureStorageBlobContainerName}")
        .log(LoggingLevel.INFO,"Connecting To Account Name: ${header.CamelAzureStorageBlobSourceBlobAccountName}")
        .toD("azure-storage-blob://${header.CamelAzureStorageBlobSourceBlobAccountName}/${header.CamelAzureStorageBlobContainerName}?blobName=${header.CamelFileName}&operation=uploadBlockBlob&serviceClient=#serviceClient")
        .log(LoggingLevel.INFO,"${header.CamelFileName} Uploaded to ${header.CamelAzureStorageBlobContainerName} Container Successfully")
        .end();

您已经 provided 回答了您的其他问题。甚至在那里添加了一些代码示例来帮助测试文件路由,尽管使用更通用的 CamelTestSupport 而不是 Spring 注释。

专注于测试您的路由逻辑,而不是骆驼组件或外部服务

编写 camel 单元测试时要了解的关键是你应该专注于测试你的路由逻辑而不是 camel 组件。维护 camel 的人已经为 camel 和大多数(如果不是全部的话)可用组件编写了一堆单元测试。

为了避免 over-complicating 单元测试,最好了解不同级别的测试及其范围和目的。

测试级别

  1. 单元测试
  2. 集成测试
  3. 系统测试
  4. 验收测试

您可以从各种在线文章以及 wikipedia.

中找到有关它们的更多信息

正在测试 azure-storage-blob 路线

当涉及到仅将文件发送到 blob 存储或类似内容的路由时,通常没有太多的业务逻辑需要测试。您应该测试的是 azure-storage-blob 端点是否实际接收到文件。此外,您可能有业务要求要求您在发送前验证文件(即内容是否有效,file/blob 名称是否遵循所需的命名约定等)

  1. 测试azure-storage-blob端点接收文件
  2. 测试 azure-storage-blob 端点是否收到有效数据。
  3. 测试路由记录错误或在不记录错误时抛出正确的异常。
    • 如果正在使用监视,则错误消息可能需要采用某种特定格式才能使警报和诸如此类的东西起作用。
  4. 测试无效数据不会发送到 azure-storage-blob 端点
  5. 使用 azure 记录错误或适当的异常来测试连接错误。
    • 这些对于系统和集成测试非常有帮助,如果集成配置、防火墙和诸如此类的问题出现问题,可以在以后进行这些测试。

因为你的路线有一些依赖关系,比如headers:

  • CamelAzureStorageBlobSourceBlobAccountName
  • CamelAzureStorageBlobContainerName
  • 骆驼文件名

你可以测试一下:

  1. azure-storage-blob 端点收到这些 headers 当给定
  2. 如果这些 headers 中的任何一个缺失,路由记录错误或抛出适当的异常。

对于这些测试,您可以使用 adviceWith and weave to replace the azure-storage-blob endpoint using weaveByURI or weaveByIDreplace

例子

context.adviceWith(context.getRouteDefinition("uploadFile"), 
    new AdviceWithRouteBuilder(){

            @Override
            public void configure() throws Exception {
                
                weaveByToUri("azure-storage-blob:*")
                    .replace()
                    .to("mock:azure-storage-blob");
            }
        }
    );

MockEndpoint azureBlobStorageMockEndpoint = getMockEndpoint("mock:azure-storage-blob");
azureBlobStorageMockEndpoint.expectedMessageCount(1);
azureBlobStorageMockEndpoint.message(0)
        .header(Exchange.FILE_NAME).isEqualTo("TestFile.json");

InputStream body = fetchFileFromResourcesFolderAsStream("test-files/TestFile.json");
Map<String, Object> headers = new HashMap<>();
headers.put(Exchange.FILE_NAME, "TestFile.json");

startCamelContext();
template.sendBodyAndHeaders("direct:start", body, headers);

azureBlobStorageMockEndpoint.assertIsSatisfied();

这些测试需要对您的实际路线进行最少的修改,因为它们只是测试当提供特定输入时路线产生预期输出的时间。