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

任务。

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. 模拟耗时操作_在集成测试中模拟耗时的动作

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

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

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

  3. spock 集成测试_Spock 1.2 –轻松进行集成测试中的Spring Bean模拟

    spock 集成测试 探索如何使用Spock 1.2将Spock的模拟和间谍自动注入到Spring上下文中. Spock中的存根/模拟/间谍(及其生命周期)一直与Spock Specification ...

  4. Spock 1.2 –轻松进行集成测试中的Spring Bean模拟

    探索如何使用Spock 1.2将Spock的模拟和间谍自动注入到Spring上下文中. Spock中的存根/模拟/间谍(及其生命周期)一直与Spock Specification类紧密结合. 只能在测 ...

  5. 使用Spring Boot隔离集成测试和模拟依赖项

    集成测试可能很慢且不可靠,因为它们依赖于系统中过多的组件. 在某种程度上,这是不可避免的:这里的集成测试是为了验证系统的每个部分如何与其他内部或外部组件一起玩. 但是,我们可以通过仅分解所需的依赖关系 ...

  6. selenium中录制拖拽动作

    今天工作中遇到了selenium中录制拖拽动作需求:在同一个页面上,将一个table中的元素拖拽到另外一个table中. 通过查看帮助文档是使用dragAndDrop或类似的命令.根据使用方法drag ...

  7. node 单元测试_如何在Node中模拟对单元测试的请求

    node 单元测试 by Edo Rivai 由Edo Rivai 如何在Node中模拟对单元测试的请求 (How to mock requests for unit testing in Node) ...

  8. python物理模拟_如何在Python 游戏中模拟引力

    学习如何使用 Python 的 Pygame 模块编程电脑游戏,并开始操作引力. 真实的世界充满了运动和生活.物理学使得真实的生活如此忙碌和动态.物理学是物质在空间中运动的方式.既然一个电脑游戏世界没 ...

  9. Princeton NLP Group姚顺雨博士:文本游戏中基于语言模型的动作生成

    ⬆⬆⬆              点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! "你在卧室,东边是一个走廊,西边有一个紧闭的木门,屋子中间有一个厚地毯,一个储物柜,你有一个 ...

最新文章

  1. java 多线程 1 “常用的实现多线程的2种方式”:Thread 和 Runnable
  2. Python筛选中文字符(跟网上其他可能不一样)
  3. getPath()和getResource()找不到文件(NullPointerException)的原因(idea创建properties文件)
  4. confluence 5 mysql_Centos 6.5 安装 Atlassiana Crowd+JIRA+Confluence(Wiki)之一 数据库篇(MySQL5.1)...
  5. 一些微服务拆分的浅见
  6. 微信小程序视频弹幕效果
  7. plupload怎么设置属性_店铺收银系统怎么用?好收银系统能提升店铺效率
  8. html模态窗口调试,在模态窗口中显示HTML标记
  9. Python的并发并行[3] - 进程[0] - subprocess 模块
  10. windows10如何注销
  11. 传统项目管理和敏捷项目管理的区别是什么?
  12. word2016页码怎么设置从任意指定页开始
  13. 数据库的三才阵——人
  14. web全栈工程师技能介绍
  15. LayUI实现Checkbox复选框的单选及取消单选,即只能选一个或者全都不选
  16. 超详细的卷积后大小的计算公式
  17. 计算机世界报约稿,#约稿# 柯洁不行?中国计算机围棋科学家组团挑战AlphaGo...
  18. scp 复制多个文件到远程主机
  19. [庖丁解牛]GCC编译过程详析
  20. 【植树节专题】回顾TcaplusDB的十年发展史

热门文章

  1. rabbitmq-通配符模式
  2. 不停机与停机更新_Istio的零停机滚动更新
  3. 堆栈溢出 java_堆栈溢出回答了我们所不知道的Java首要问题
  4. jvm高并发_在JVM上对高并发HTTP服务器进行基准测试
  5. 什么是openstack_您在OpenStack Summit 2016上错过了什么
  6. Java:可选的可选实现
  7. joo工作流_不要错过使用jOOλ或jOOQ编写Java 8 SQL单行代码的机会
  8. 对编写的代码进行单元测试_编写数据访问代码测试–单元测试是浪费
  9. 通过Java Hipster升级Spring Security OAuth和JUnit测试
  10. J2Pay –实施网关