问题描述
我有一个简单的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>
我的问题:
- 在单元测试环境中,如何在不依赖真实文件系统的情况下,在内存中文件??
- 如何测试我的输入文件已推送到
inputFileChannel
/inputFileSuccessChannel
?如何模拟inputFileErrorChannel
? - 再次在单元测试上下文中,而不依赖真实的文件系统,如何测试我的内存中输入文件已被删除(使用
<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,但是我可以找到合适的解决方案。
解决方法
- 是
- 在频道中添加频道拦截器,或参阅the documentation about mocking endpoints。
- 如果您将测试文件发送到频道;您可以检查测试完成后是否仍然存在。