模拟耗时操作

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

任务。

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

模拟耗时操作

模拟耗时操作_在集成测试中模拟耗时的动作相关推荐

  1. java耗时操作阻塞_springboot~高并发下耗时操作的实现

    高并发下的耗时操作 官方文档中说DeferredResult和Callable都是为了异步生成返回值提供基本的支持.简单来说就是一个请求进来,如果你使用了DeferredResult或者Callabl ...

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

    最近在我的一个项目中,我遇到一种情况,需要为该应用程序创建集成测试. 这不是很奇怪,不是吗? 有趣的是,该应用程序的逻辑涉及一些并发问题,并且其中一个组件必须连接到外部服务,这将花费几秒钟的事实. 由 ...

  3. python并发循环_在Python中模拟一个并发循环?

    在Python中模拟一个并发循环? 我需要模拟Python程序中的并发循环.不幸的是,以下简单的代码不起作用:list_of_ints = [ 1, 2, 3 ]iterator = list_of_ ...

  4. android 模拟点击home,Android launcher中模拟按home键的实现

    Android launcher中模拟按home键的实现 Intent mHomeIntent = new Intent(Intent.ACTION_MAIN); mHomeIntent.addCat ...

  5. java根据散点图模拟出直线_借助Excel中XY散点图来模拟实现纵向折线图的方法

    Excel中的折线图通常是在水平方向上展示数据图线,如果希望在纵向上也能展现折线图,可以借助XY散点图来模拟实现.本文就图文介绍了借助Excel中XY散点图来模拟实现纵向折线图的方法. 具体方法可参考 ...

  6. 静态路由_在Android中模拟静态方法:让我们总结一下

    静态路由 在Android中编写本地单元测试时,面临的局限性之一是测试是针对没有任何代码的android.jar版本运行的. 如文档所述,必须模拟对Android代码的任何依赖关系. 一个简单的单元测 ...

  7. ASP.NET Core 集成测试中模拟登录用户的一种姿势

    不管哪种用户验证方式,最终都是在验证成功后设置 HttpContext.User ,后续处理环节通过 HttpContext.User 获取用户信息.如果能直接修改 HttpContext.User ...

  8. python模拟浏览器模块_在Python中使用mechanize模块模拟浏览器功能

    知道如何快速在命令行或者python脚本中实例化一个浏览器通常是非常有用的. 每次我需要做任何关于web的自动任务时,我都使用这段python代码去模拟一个浏览器. import mechanize ...

  9. android+无触摸操作,如何在Android中模拟触摸事件?

    这是一个monkeyrunner脚本,用于将触摸和拖动操作发送到应用程序.我一直在使用它来测试我的应用程序可以处理快速重复的滑动手势. # This is a monkeyrunner jython ...

最新文章

  1. xcode多target
  2. 关于String的matches方法
  3. ITK:像素是否在区域内
  4. IDEA的maven项目报错BeanCreationException: Error creating bean with name “xxxController”
  5. keepalived vrrp协议
  6. 递归下降分析程序的设计与实现_递归就是这么简单
  7. 【华为云技术分享】传统OCR识别综述
  8. 记录MS SQL Server数据库
  9. 科密指纹考勤机软件配置
  10. 谷歌地球 Google Earth v7.3.2.5495 专业版
  11. 腾讯视频投屏显示无法连接服务器,腾讯视频突然不能投屏怎么办 投屏连接失败解决方法...
  12. Android网易评论盖楼效果实现
  13. 第三方支付和第四方支付有什么区别?
  14. 如何参与Github开源社区开发
  15. 精彩来袭!华为将携手数据库领域专家出席NDBC 2021
  16. 路漫漫远修兮-centos7 oracle 11g 静默安装教程
  17. JRebel and XRebel idea热部署插件的使用
  18. 新书推荐 |《机器学习即服务:将Python机器学习创意快速转变为云端Web应用程序》...
  19. 越南籍学生如何进行计算机教学,浅谈计算机教学中越南文输入法的注意事项
  20. Android App修改字体大小,且不随系统字体大小更改

热门文章

  1. Spring零配置之@Configuration注解详解
  2. Java Excel导出
  3. 顺序表基本操作在主函数中的实现
  4. 班级日常 | 一天一瞬间!
  5. jQuery选择器案例之——index.js
  6. 笑死了,打错一个字,竟然...
  7. 把本地文件上传到gitee
  8. Linux清理磁盘挂载点方法(亲测有效)
  9. C语言 立方体随鼠标转动,HTML5鼠标控制的旋转的立方体
  10. window7连接其他计算机的打印机,win7系统电脑怎样连接其它电脑上在打印机?