如何对Spring Integration的int-file:inbound-channel-adapter进行单元测试

问题描述

我有一个简单的Spring Integration流,其中我从给定目录读取XML文件,并将其内容发送到另一个通道并进行其他处理。

处理完成后,我需要将输入文件移动到存档/错误目录中。

file-integration.xml

<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:int-file="http://www.springframework.org/schema/integration/file"
       xmlns:int="http://www.springframework.org/schema/integration"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd
       http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/integration/file https://www.springframework.org/schema/integration/file/spring-integration-file.xsd
       http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

  <import resource="transaction-manager-configuration.xml"/>

  <context:property-placeholder location="classpath:app.properties"/>

  <int:channel id="inputFileChannel"/>

  <int-file:inbound-channel-adapter channel="inputFileChannel"
                                    directory="${inputDir}"
                                    filename-pattern="*.xml">
    <int:poller fixed-delay="1000">
      <int:transactional transaction-manager="txManager" synchronization-factory="syncFactory"/>
    </int:poller>
  </int-file:inbound-channel-adapter>

  <int-file:file-to-string-transformer input-channel="inputFileChannel"
                                       output-channel="contentChannel"/>

  <int:channel id="contentChannel"/>
  <int:channel id="inputFileSuccessChannel"/>
  <int:channel id="inputFileErrorChannel"/>

  <!-- Move file after being processed -->

  <int:transaction-synchronization-factory id="syncFactory">
    <int:after-commit channel="inputFileSuccessChannel"/>
    <int:after-rollback channel="inputFileErrorChannel"/>
  </int:transaction-synchronization-factory>

  <int-file:outbound-channel-adapter channel="inputFileSuccessChannel"
                                     directory="${archiveDir}"
                                     delete-source-files="true"/>

  <int-file:outbound-channel-adapter channel="inputFileErrorChannel"
                                     directory="${errorDir}"
                                     delete-source-files="true"/>

</beans>

我的问题:

  1. 在单元测试环境中,如何在不依赖真实文件系统的情况下,在内存中文件??
  2. 如何测试我的输入文件已推送到inputFileChannel / inputFileSuccessChannel?如何模拟inputFileErrorChannel
  3. 再次在单元测试上下文中,而不依赖真实的文件系统,如何测试我的内存中输入文件已被删除(使用<int-file:outbound-channel-adapter/>语句配置)?

目前,我有一个JUnit 5测试类delete-source-files="true"

FileIntegrationTest.java

及其上下文文件@ExtendWith(SpringExtension.class) @ContextConfiguration @PropertySource("classpath:app.properties") @SpringIntegrationTest public class FileIntegrationTest { @Autowired MessageChannel inputFileChannel; @Autowired QueueChannel contentTestChannel; @Test void shouldReadInputFile_thenMoveIt() { // arrange File inputFile = new … // question 1 Message<File> inputMessage = MessageBuilder.withPayload(file).build(); // act inputFileChannel.send(inputMessage); // assert assertthat(contentTestChannel.getQueueSize(),is(1)); assertthat(inputFileSuccessChannel contains my input file); // question 2 assertthat(inputFile has been deleted); // question 3 } }

FileIntegrationTest-context.xml

Spring Testing support官方页面提到了模拟的使用,但是我对如何使用它感到困惑。我也已经签出https://github.com/spring-projects/spring-integration-samples,但是我可以找到合适的解决方案。

解决方法

  1. 在频道中添加频道拦截器,或参阅the documentation about mocking endpoints
  2. 如果您将测试文件发送到频道;您可以检查测试完成后是否仍然存在。