在集成测试中模拟耗时的动作

最近在我的一个项目中,我遇到一种情况,需要为该应用程序创建集成测试。 这不是很奇怪,不是吗? 有趣的是,该应用程序的逻辑涉及一些并发问题,并且其中一个组件必须连接到外部服务,这将花费几秒钟的事实。 由于在集成测试中不需要进行实际的连接,因此需要对组件进行模拟。 模拟耗时的动作呢? 好吧,让我们来看看我的做法…

任务。

package pl.grzejszczak.marcin;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** Service that does some things including processing of the external service* * @author marcin* */
public class SomeTask implements Runnable {private static final Logger LOGGER = LoggerFactory.getLogger(SomeTask.class);// Service is injected via a dependency injection systemprivate Processable timeConsumingExternalService;private void methodThatConnectsToExternalServices() {// connects to an external service and spends a couple of seconds thereLOGGER.debug("Before processing");timeConsumingExternalService.process();LOGGER.debug("After processing");// some other things to do}public void run() {methodThatConnectsToExternalServices();}public void setTimeConsumingExternalService(Processable timeConsumingExternalService) {this.timeConsumingExternalService = timeConsumingExternalService;}}

集成测试。

package pl.grzejszczak.marcin;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class ServiceIntegrationTest {private static final Logger LOGGER = LoggerFactory.getLogger(ServiceIntegrationTest.class);private ExecutorService executorService = Executors.newCachedThreadPool();private Processable timeConsumingExternalServiceMock = Mockito.mock(Processable.class);private SomeTask someTask = new SomeTask();public ServiceIntegrationTest() {initializeMocks();}private void initializeMocks() {Mockito.doAnswer(new Answer<Object>() {public Object answer(InvocationOnMock invocation) throws Throwable {// Simulation of connection to external servicesLOGGER.debug("Sleeping");Thread.sleep(5000);LOGGER.debug("Stopped Sleeping");return null;}}).when(timeConsumingExternalServiceMock).process();// Inject the mock to the Task - in any possible waysomeTask.setTimeConsumingExternalService(timeConsumingExternalServiceMock);}public void executeTest() {executorService.execute(someTask);}public static void main(String args[]) {ServiceIntegrationTest integrationTest = new ServiceIntegrationTest();integrationTest.executeTest();}
}

并输出到控制台:

2012-10-07 22:42:37,378 DEBUG pl.grzejszczak.marcin.SomeTask:21 Before processing2012-10-07 22:42:37,389 DEBUG pl.grzejszczak.marcin.ServiceIntegrationTest:28 Sleeping2012-10-07 22:42:42,390 DEBUG pl.grzejszczak.marcin.ServiceIntegrationTest:30 Stopped Sleeping2012-10-07 22:42:42,392 DEBUG pl.grzejszczak.marcin.SomeTask:23 After processing

让我们仔细看看其中最重要的部分,在其中创建用于执行服务的答案

Mockito.doAnswer(new Answer<Object>() {public Object answer(InvocationOnMock invocation) throws Throwable {// Simulation of connection to external servicesLOGGER.debug("Sleeping");Thread.sleep(5000);LOGGER.debug("Stopped Sleeping");return null;}}).when(timeConsumingExternalServiceMock).process();

这段代码更改了给定对象在给定方法执行时应执行的默认操作。 在这种特殊情况下,我们必须模拟一个返回void的方法-这就是为什么我们从doAnswer(...)开始并以when(...)。process()结尾。 这就是我在集成测试中设法创建一个模拟等待服务完成的方式。 如果您有其他想法或意见,请随时在下面发表评论

参考:来自我们的JCG合作伙伴 Marcin Grzejszczak(位于Blog上)的 集成测试中耗时行为的模拟, 用于编码成瘾者博客。

翻译自: https://www.javacodegeeks.com/2013/04/simulation-of-time-consuming-actions-in-integration-tests.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368691.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html基础-html简介-第一个网页(1)

今天刚刚开通博客园&#xff0c;把我最近整理的html/css来说一下&#xff0c;对于初学者还是有一定的帮助。 一、先来为大家简单普及以下html &#xff08;1&#xff09;、html英文即&#xff1a;hypertext markup language 中译 &#xff1a; 超文本标记语言 &#xff08;2&…

javafx android sdk,JavaFX打包到Android上

让JavaFX运行到移动平台一直是社区努力完成的事。当然&#xff0c;目前已经可以让JavaFX运行到Android和IOS平台了&#xff0c;下面我们来看看如何打包自己的JavaFX项目到Android平台。这个示例是我从打包官方示例的例子里修改而来&#xff0c;用于打包一个简单的JavaFX程序。示…

在zookeeper集群的基础上,搭建伪solrCloud集群

伪集群的搭建&#xff1a;将solrCloud搭建到同一台机器上。 准备工作 1 将在window中部署的单机版solr上传到服务器&#xff08;虚拟机&#xff09;中 solr的简单部署&#xff1a;在tomcat中启动slor 的内容 这一次放到 mkdir /usr/local/solr-cloud 文件夹内并解压 2 复制4份…

Python-IndexError: list index out of range

Error&#xff1a;IndexError: list index out of range Where? 对Python中有序序列进行按索引取值的时候&#xff0c;出现这个异常 Why? 对于有序序列&#xff1a; 字符串 str 、列表 list 、元组 tuple进行按索引取值的时候&#xff0c;默认范围为 0 ~ len(有序序列)-1&…

摆脱困境:向REST API添加验证

我对此感到有些to愧&#xff0c;但直到昨天&#xff0c;我才知道我可以使用Valid和RequestBody批注将验证添加到REST API中。 这在Spring MVC 3.0中不起作用&#xff0c;由于某种原因&#xff0c;我没有注意到在Spring MVC 3.1中添加了对此功能的支持 。 我从不喜欢旧的方法&am…

三星 原生android,原生Android 4.0 三星GALAXY Nexus评测

前言&#xff1a;北京时间10月19日上午10时&#xff0c;谷歌联合三星在香港举行了一场主题为“Calling all possibilities ”的新品发布会&#xff0c;在发布会上正式推出了搭载最新Android 4.0操作系统的智能手机三星GALAXY Nexus。三星GALAXY Nexus每一代的Nexus都被看做是An…

css类选择器类名覆盖优先级

code <style>.a{background: red;}.b{background: yellow;} </style> <div class"a b">A</div> 渲染效果 最初以为更改元素中class类里面的类名顺序&#xff0c;渲染效果就会根据类名顺序依次渲染code <style>.a{background: red;…

IntelliJ IDEA插件-常用插件

IntelliJ IDEA的插件真的很多&#xff0c;最近的新版集成的插件已经基本够用&#xff0c;下面是收集的一些常用插件&#xff0c;根据需要来安装和测试。如果还是没有找到&#xff0c;那么自己来开发一个。 官网&#xff1a;https://plugins.jetbrains.com/ 插件开发资料&#x…

CMD命令锦集

虽然随着计算机产业的发展&#xff0c;Windows 操作系统的应用越来越广泛&#xff0c;DOS 面临着被淘汰的命运&#xff0c;但是因为它运行安全、稳定&#xff0c;有的用户还在使用&#xff0c;所以一般Windows 的各种版本都与其兼容&#xff0c;用户可以在Windows 系统下运行DO…

在运行时访问工件的Maven和SCM版本

您可以轻松地告诉Maven在JAR清单文件中包含工件的版本及其Git / SVN /…修订版&#xff0c;然后在运行时通过getClass&#xff08;&#xff09;。getPackage访问该信息。 getImplementationVersion&#xff08;&#xff09; 。 &#xff08;所有功劳归功于MarkusKrger和其他同事…

Bootstrap学习笔记01

1、Make Images Mobile Responsive 用处&#xff1a; 使图片适配你的页面宽度。 操作&#xff1a; 给图片添加 .img-responsive class属性。 <img src"/images/cat.jpg" class"img-responsive"> 2、Center Text with Bootstrap 用处&#xff…

linux开机启动nginx

1.从创建文件nginx 位置/etc/init.d/nginx 2.粘贴内容 #!/bin/sh # # nginx - this script starts and stops the nginx daemon # # chkconfig: - 85 15 # description: Nginx is an HTTP(S) server, HTTP(S) reverse \ # proxy and IMAP/POP3 proxy server #…

您可能不知道的五个高级Java同步器

除了基于每个Java对象具有的锁定位的通用同步外&#xff0c;您还可以使用Java中更复杂的同步器&#xff0c;例如&#xff1a; 信号量 –使用许可的概念表示一个位置中允许的最大线程数。 当使用值1时&#xff0c;其行为类似于同步&#xff0c;也称为二进制信号量。 但是&#…

2017-2018-2 20179216 《网络攻防与实践》 SQL注入攻击

1. SQL语言 结构化查询语言(Structured Query Language)简称SQL&#xff1a;是一种特殊目的的编程语言&#xff0c;是一种数据库查询和程序设计语言&#xff0c;用于存取数据以及查询、更新和管理关系数据库系统&#xff1b;同时也是数据库脚本文件的扩展名。 2. SQL注入 SQL注…

借百度爸爸下蛋的好看搜索框

学习vue时写的一个小demo 虽然实现很简单&#xff0c;但还是推介看看&#xff0c;没什么难点&#xff0c;而且有些东西你可能会用到&#xff01;在线演示demo源码

数据库关系

第1层&#xff1a;高并发、高速查询 memory cached(内存高速缓存数据库)第2层&#xff1a;持久化保存 redis第3层&#xff1a;数据保存1、sql server,mysql,sqlite等关系型数据库2、mongo db 在很大程度上&#xff0c;redis可以替代mongo db&#xff08;持久化、文件保存&#…

web.config详解

<?xml version"1.0"?><!--注意: 除了手动编辑此文件以外&#xff0c;您还可以使用 Web 管理工具来配置应用程序的设置。可以使用 Visual Studio 中的“网站”->“Asp.Net 配置”选项。设置和注释的完整列表在 machine.config.comments 中&#xff0c;该…

华为智能手表与鸿蒙,不再是大号手环!华为鸿蒙手表来了:要和苹果抢生态?...

5 月 27 日上午&#xff0c;华为终端官方微博官宣&#xff0c;WATCH 3 腕上智慧&#xff0c;一表万象&#xff0c;旗舰归来&#xff0c;将于 6 月 2 日晚 20:00 与 HarmonyOS、MatePad Pro 2 等产品一同发布。依靠手环的超高销量&#xff0c;华为、小米等企业发力&#xff0c;在…

页面重构-让我们的布局自适应

css重构之旅 >前言&#xff1a; 今年我大一,马上就要大二了。从高三毕业暑假到大学的这一年马上过去&#xff0c;马上迎来大二生活.学习前端也有将近一年了。一昧去追求那些视觉的效果和相对高端和新颖的技术&#xff0c;反而忽略了最基础的布局技巧。 回味 2017年3月&am…

重新同步多线程集成测试

我最近在Captain Debug的Blog上偶然发现了一篇文章“ 同步多线程集成测试 ”。 该文章强调了设计涉及被测类以异步方式运行业务逻辑的集成测试的问题。 给出了这个人为的示例&#xff08;我删除了一些评论&#xff09;&#xff1a; public class ThreadWrapper {public void d…