我想正确的单元和集成测试用例来测试所有的功能流。有人可以分享你的想法,我可以如何创建一个模拟端点来监视目录的文件创建,并进一步处理他们通过多个路线,并将文件移动到不同的目录。
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();
}
}
1条答案
按热度按时间tnkciper1#
MockEndpoint仅支持生成器终结点。这是因为它被设计为执行对Exchange和消息的Assert。
例如:
测试路由时,您应该使用ProducerTemplate send方法来启动测试中的路由,并使用您想要测试的任何主体、标头和属性。
在您的情况下,您可以使用java文件操作从测试资源文件夹中读取一个文件作为字符串、字节数组或流,并使用将其作为正文沿着标题
CamelFileName
和CamelFileEventType
发送到目标路由。我还建议将您的直接路由视为函数,以使它们更容易测试。这意味着,您可以使用只按正确顺序调用子路由的父路由,而不是从一个路由跳到另一个路由。
这使您可以轻松地为
direct:updateHeaders
、direct:uploadFileToBlob
和direct:processedFiles
编写单独的测试例如:
direct:uploadFileToBlob
是否会在其中一个必要的信头遗失或无效时掷回适当的例外状况。direct:uploadFileToBlob
是否正确处理与azure的连接异常。direct:processedFiles
是否将文件放置到正确的文件夹。如果要测试文件输出,可以使用JUnits
TemporaryFolder
创建临时文件夹,然后将其作为文件生成器端点的目标。完成路由后,可以使用基本的assertEquals
和文件操作来检查输出是否满足测试要求。Apache Commons IO对于从资源阅读文件和将文件复制到TemporaryFolder的测试来说也是非常方便的库。
结合文件示例、ProducerTemplate、Commons IO和CamelTestSupport:
第一个
3.4.4以上使用Camel的示例