模拟耗时操作_在集成测试中模拟耗时的动作
模拟耗时操作
最近在我的一个项目中,我遇到一种情况,需要为该应用程序创建集成测试。 这不是很奇怪,不是吗? 有趣的是,应用程序的逻辑涉及一些并发问题,并且其中一个组件必须连接到外部服务,这将花费几秒钟。 由于在集成测试中不需要进行实际的连接,因此需要对组件进行模拟。 模拟耗时的动作呢? 好吧,让我们来看看我的做法...
任务。
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()结尾的原因。 这就是我在集成测试中设法创建一个模拟等待服务完成的方式。 如果您有其他想法或意见,请随时在下面发表评论
翻译自: https://www.javacodegeeks.com/2013/04/simulation-of-time-consuming-actions-in-integration-tests.html
模拟耗时操作
模拟耗时操作_在集成测试中模拟耗时的动作相关推荐
- java耗时操作阻塞_springboot~高并发下耗时操作的实现
高并发下的耗时操作 官方文档中说DeferredResult和Callable都是为了异步生成返回值提供基本的支持.简单来说就是一个请求进来,如果你使用了DeferredResult或者Callabl ...
- 在集成测试中模拟耗时的动作
最近在我的一个项目中,我遇到一种情况,需要为该应用程序创建集成测试. 这不是很奇怪,不是吗? 有趣的是,该应用程序的逻辑涉及一些并发问题,并且其中一个组件必须连接到外部服务,这将花费几秒钟的事实. 由 ...
- python并发循环_在Python中模拟一个并发循环?
在Python中模拟一个并发循环? 我需要模拟Python程序中的并发循环.不幸的是,以下简单的代码不起作用:list_of_ints = [ 1, 2, 3 ]iterator = list_of_ ...
- android 模拟点击home,Android launcher中模拟按home键的实现
Android launcher中模拟按home键的实现 Intent mHomeIntent = new Intent(Intent.ACTION_MAIN); mHomeIntent.addCat ...
- java根据散点图模拟出直线_借助Excel中XY散点图来模拟实现纵向折线图的方法
Excel中的折线图通常是在水平方向上展示数据图线,如果希望在纵向上也能展现折线图,可以借助XY散点图来模拟实现.本文就图文介绍了借助Excel中XY散点图来模拟实现纵向折线图的方法. 具体方法可参考 ...
- 静态路由_在Android中模拟静态方法:让我们总结一下
静态路由 在Android中编写本地单元测试时,面临的局限性之一是测试是针对没有任何代码的android.jar版本运行的. 如文档所述,必须模拟对Android代码的任何依赖关系. 一个简单的单元测 ...
- ASP.NET Core 集成测试中模拟登录用户的一种姿势
不管哪种用户验证方式,最终都是在验证成功后设置 HttpContext.User ,后续处理环节通过 HttpContext.User 获取用户信息.如果能直接修改 HttpContext.User ...
- python模拟浏览器模块_在Python中使用mechanize模块模拟浏览器功能
知道如何快速在命令行或者python脚本中实例化一个浏览器通常是非常有用的. 每次我需要做任何关于web的自动任务时,我都使用这段python代码去模拟一个浏览器. import mechanize ...
- android+无触摸操作,如何在Android中模拟触摸事件?
这是一个monkeyrunner脚本,用于将触摸和拖动操作发送到应用程序.我一直在使用它来测试我的应用程序可以处理快速重复的滑动手势. # This is a monkeyrunner jython ...
最新文章
- xcode多target
- 关于String的matches方法
- ITK:像素是否在区域内
- IDEA的maven项目报错BeanCreationException: Error creating bean with name “xxxController”
- keepalived vrrp协议
- 递归下降分析程序的设计与实现_递归就是这么简单
- 【华为云技术分享】传统OCR识别综述
- 记录MS SQL Server数据库
- 科密指纹考勤机软件配置
- 谷歌地球 Google Earth v7.3.2.5495 专业版
- 腾讯视频投屏显示无法连接服务器,腾讯视频突然不能投屏怎么办 投屏连接失败解决方法...
- Android网易评论盖楼效果实现
- 第三方支付和第四方支付有什么区别?
- 如何参与Github开源社区开发
- 精彩来袭!华为将携手数据库领域专家出席NDBC 2021
- 路漫漫远修兮-centos7 oracle 11g 静默安装教程
- JRebel and XRebel idea热部署插件的使用
- 新书推荐 |《机器学习即服务:将Python机器学习创意快速转变为云端Web应用程序》...
- 越南籍学生如何进行计算机教学,浅谈计算机教学中越南文输入法的注意事项
- Android App修改字体大小,且不随系统字体大小更改