Spring集成文件轮询和测试
我最近实施了一个小项目,在该项目中,我们必须轮询文件夹中的新文件,然后在文件内容上触发服务流。
Spring Integration非常适合此要求,因为它带有一个通道适配器 ,该适配器可以扫描文件夹中的新文件,然后通过消息传递流程获取文件。
本文的目的是研究如何测试文件轮询器流。
首先考虑使用以下Spring集成配置实现的简单流程:
<beans:beans xmlns="http://www.springframework.org/schema/integration".....<channel id="fileChannel"></channel><channel id="processedFileChannel"></channel><int-file:inbound-channel-adapter directory="${inbound.folder}" channel="fileChannel" filename-pattern="*.*"><poller fixed-delay="5000"></poller></int-file:inbound-channel-adapter><service-activator input-channel="fileChannel" ref="fileHandlerService" method="handle" output-channel="processedFileChannel"></service-activator><logging-channel-adapter id="loggingChannelAdapter" channel="processedFileChannel"></logging-channel-adapter><beans:bean name="fileHandlerService" class="files.RealFileHandlingService"/><context:property-placeholder properties-ref="localProps" local-override="true"/><util:properties id="localProps"></util:properties>
</beans:beans>
在图中更好地表示了这一点:
流程简单测试
现在要测试此流程,我的第一种方法是将示例文件放入类路径中的文件夹中,在测试过程中动态发现并使用此文件夹名称,并将最终消息写入测试通道,并对进入该通道的消息进行断言。 这是组成原始Spring配置的测试配置的样子:
<beans:beans xmlns="http://www.springframework.org/schema/integration"....<beans:import resource="si-fileprocessing.xml"/><util:properties id="localProps"><beans:prop key="inbound.folder">#{new java.io.File(T(java.io.File).getResource("/samplefolder/samplefile.txt").toURI()).parent}</beans:prop></util:properties><channel id="testChannel"><queue/></channel><bridge id="loggingChannelAdapter" input-channel="processedFileChannel" output-channel="testChannel"></bridge>
</beans:beans>
测试看起来像这样:
@Autowired @Qualifier("testChannel") PollableChannel testChannel;@Test
public void testService() throws Exception{Message<?> message = this.testChannel.receive(5000);assertThat((String)message.getPayload(), equalTo("Test Sample file content"));
}
这可以很好地工作,尤其要注意,可以使用Spring-EL表达式在配置中完全提供路径:
#{new java.io.File(T(java.io.File).getResource("/samplefolder/samplefile.txt").toURI()).parent}
模拟服务
现在,进一步介绍一下,如果我想模拟正在处理文件的服务(files.RealFileHandlingService),该怎么办。 一旦实现了模拟,这里就会出现一个问题。 注入模拟服务的一种方法是使用Mockito和它提供的帮助程序功能,以使用Spring配置文件通过这种方式创建模拟:
<beans:bean name="fileHandlerService" factory-method="mock" class="org.mockito.Mockito"><beans:constructor-arg value="files.FileHandlingService"></beans:constructor-arg>
</beans:bean>
创建此模拟bean之后,可以通过以下方式在junit的@Before注释方法中添加模拟行为:
@Before
public void setUp() {when(fileHandlingServiceMock.handle((File)(anyObject()))).thenReturn("Completed File Processing");
}@Test
public void testService() throws Exception{Message<?> message = this.testChannel.receive(5000);assertThat((String)message.getPayload(), equalTo("Completed File Processing"));
}
如果现在重复测试,令人惊讶的是它将失败,原因是–在调用Junit的@Before方法时,Spring应用程序上下文已完全初始化,并且轮询进入文件夹的文件的轮询器在模拟之前被触发行为被添加,因此,如果没有正确的模拟服务行为,测试将失败。
我确定还有其他修复程序,但是对我有用的修复程序实际上是控制扫描哪个文件夹以及在什么时候将文件放置在文件夹中以触发流。 这很大程度上基于我在Spring Integration项目本身中看到的一些测试 。 诀窍是先使用Spring config创建一个临时文件夹,然后将该文件夹设置为轮询文件夹:
<beans:bean id="temp" class="org.junit.rules.TemporaryFolder"init-method="create" destroy-method="delete"/><beans:bean id="inputDirectory" class="java.io.File"><beans:constructor-arg value="#{temp.newFolder('sitest').path}"/>
</beans:bean> <util:properties id="localProps"><beans:prop key="inbound.folder">#{inputDirectory.getAbsolutePath()}</beans:prop>
</util:properties>
现在,仅在测试运行期间将文件放置在临时文件夹中,这样@Before注释方法就有机会向模拟添加行为,并且可以明确断言模拟的行为:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("si-test.xml")
public class FileHandlingFlowTest {@Autowired @Qualifier("testChannel") private PollableChannel testChannel;@Autowired private FileHandlingService fileHandlingServiceMock;@Autowired @Qualifier("inputDirectory") private File inputDirectory;@Beforepublic void setUp() {when(fileHandlingServiceMock.handle((File)(anyObject()))).thenReturn("Completed File Processing");}@Testpublic void testService() throws Exception{Files.copy(new File(this.getClass().getResource("/samplefolder/samplefile.txt").toURI()), new File(inputDirectory, "samplefile.txt"));Message<?> message = this.testChannel.receive(5000);assertThat((String)message.getPayload(), equalTo("Completed File Processing"));}
}
翻译自: https://www.javacodegeeks.com/2013/05/spring-integration-file-polling-and-tests.html
Spring集成文件轮询和测试相关推荐
- spring 长轮询_Spring集成文件轮询和测试
spring 长轮询 我最近实施了一个小项目,在该项目中,我们必须轮询文件夹中的新文件,然后在文件内容上触发服务流. Spring Integration非常适合此要求,因为它带有一个通道适配器 ,该 ...
- spring ajax 长轮询,Ajax轮询和长轮询
缺点:Ajax轮询需要服务器有很快的处理速度与快速响应.long poll需要很高的并发,体现在同时容纳请求的能力. 一.轮询是在浏览器客户端实现的: 如果从后端获取数据成功则停止请求. $(func ...
- Spring Integration –轮询文件的创建和修改
1引言 文件支持是Spring Integration与外部系统通信的另一个端点. 在这种情况下,它提供了几个组件来读取,写入和转换文件. 在这篇文章中,我们将编写一个监视目录的应用程序,以便读取其中 ...
- usb端点轮询_使用Spring Integration轮询http端点
usb端点轮询 如果您想用Spring Integration编写一个流程来轮询HTTP端点并从http端点收集一些内容以进行进一步处理,那有点不直观. Spring Integration提供了几种 ...
- 使用Spring Integration轮询http端点
如果您想用Spring Integration编写一个流程来轮询HTTP端点并从http端点收集一些内容以进行进一步处理,那有点不直观. Spring Integration提供了几种与HTTP端点集 ...
- linux的ftp轮询上传文件,Android中实现异步轮询上传文件
前言 前段时间要求项目中需要实现一个刷卡考勤的功能,因为涉及到上传图片文件,为加快考勤的速度,封装了一个异步轮询上传文件的帮助类 效果 先上效果图 设计思路 数据库使用的框架是GreenDao,一个非 ...
- .xhr长轮询_使用Spring 3.2的DeferredResult进行长轮询
.xhr长轮询 在我们的最后一集中 , Agile Cowboys Inc.的首席执行官刚刚雇用了Java / Spring顾问,方法是为他提供最初为女友购买的保时捷. 这位首席执行官的女友因失去保时 ...
- 使用Spring 3.2的DeferredResult进行长轮询
在我们的最后一集中 , Agile Cowboys Inc.的首席执行官刚刚雇用了Java / Spring顾问,方法是为他提供最初为女友购买的保时捷. 这位首席执行官的女友因失去保时捷而感到不安,已 ...
- nginx怎么轮询两台php,Nginx 配置轮询分流-实现负载均衡【测试通过】
做php2年多了,一直觉得这个玩意很高深,最近总想去了解下.今天抽时间,弄了感觉这个东西没有想象的那么难弄.简单的实现,确实非常容易,但是足可以实现负载均衡分布的功能了.今天就给大家分享下,也算是一个 ...
最新文章
- ViewGroup的Touch事件分发(源码分析)
- Coggle加速计划:解决数据下载烦恼!
- spring+hibernate
- 基数排序算法LSD实现
- WPF中的动画——(二)From/To/By 动画
- oracle 常用语句
- [转]Java 关闭线程的安全方法
- javaweb学习总结(三十六)——使用JDBC进行批处理
- Linux下多显卡选择绘制实验记录
- 读取不同位置的配置文件
- 在线电脑配置PHP源码,域名授权系统PHP源码 V2.7.0 支持盗版追踪
- 十分钟搞定pandas+实战
- Java并发编程-多线程基础
- SAP License:ERP实施关键问题
- 如何给一家公司做定性研究?
- SSH端口转发的理解(精华)
- 在ASP.NET AJAX中使用应用程序服务和本地化(5):自定义应用程序服务的服务器端实现...
- 实参和形参的一些问题
- Atitit websocket 的前后端实现最佳实践t66 目录 1. 技术选型	1 2. 1.首先,在pom.xml引入如下jar包。Java-WebSocket-1.3.0.jar	1 3.
- C#读IC卡程序(明华读卡器)
热门文章
- oracle中闪回和回滚,oracle闪回操作详解
- 南理工计算机博士 年薪_计算机专业的女博士毕业后,进入211大学当讲师,年薪曝光...
- (转)Kafka 消费者 Java 实现
- 转-HTTPClient调用https请求,通过基本认证用户名密码(Basic Auth)
- camel apache_Apache Camel 3只有2个月的路程
- lombok 简化代码_如何编写更少,更好的代码,或Project Lombok
- deprecated_@Deprecated新外观可能是什么?
- aws sqs_JMS和AWS SQS的更多高级内容
- quasar 异步回调_Java IO基准测试:Quasar与异步ForkJoinPool与ManagedBlock
- ZeptoN正在将程序放入Java