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

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

但是,我们可以通过仅分解所需的依赖关系而不是整个系统来改进某些集成测试。 让我们想象一个依赖于数据库,第三方REST API和消息队列的应用程序:

我的应用程序

现在假设我们希望集成测试验证仅包含对REST API的调用但不包含对数据库或消息队列的调用的行为。 举一个具体的例子,假设我们要检查REST客户端是否正确配置为3秒钟后超时。

为此,我们需要的是一个小型Controller ,该Controller将在返回答案到REST客户端之前等待,以模拟REST API。 等待时间将作为参数传递给查询字符串。

@Profile("restTemplateTimeout")
@RestController
@RequestMapping(value = "/test")
public class DelayedWebServerController {@RequestMapping(value = "/delayRestTemplate", method = GET)public String answerWithDelay(@RequestParam Long waitTimeMs) {if (waitTimeMs > 0) {try {Thread.sleep(waitTimeMs);} catch (InterruptedException e) {throw new RuntimeException(e);}}return "Delayed Result";}}

@Profile批注用于什么? 如果我们将此控制器注入到我们的标准应用程序上下文中,则有几个缺点:

  • 测试将会很慢:我们只需要启动一个控制器,而不是整个控制器
  • 我们的控制器将由Spring拾取并注入其他所有集成测试中,从而减慢每个集成测试的速度,并可能踩到另一个测试的脚趾

更好的选择是启动一个最小的Spring Boot应用程序,仅暴露我们的DelayedWebServerController 。 我们还将告诉Spring Boot仅扫描我们感兴趣的软件包,并排除与持久性相关的自动配置,因为我们不需要它来启动控制器。 这是在类似以下的Configuration类中完成的:

@Profile("restTemplateTimeout")
@Configuration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@ComponentScan(basePackages = "my.application.resttemplate.timeout")
public class DelayedWebServerConfiguration {//The class is empty and only used to support the annotations
}

Spring上下文配置可能会引起混乱,让我们一个接一个地查看批注:

  • @Profile :这告诉Spring,只有在restTemplateTimeout配置文件处于活动状态时才应使用此配置。 在本文的进一步内容中,我们将看到如何为特定的集成测试启用此配置文件。 正是这个注释防止配置被其他不相关的集成测试所采用。 请注意,我们的DelayedWebServerController具有相同的注释。
  • @Configuration :标准注释,用于告诉Spring这是一个上下文配置类。
  • @EnableAutoConfiguration :在这里,我们禁用了某些不需要进行特定测试的Spring Boot“魔术”
  • @ComponentScan :通过仅扫描一个软件包而不是整个项目,我们可以加快Spring Boot应用程序的启动速度。 Spring不会选择此包之外的任何带有Spring注释的类。

集成测试如下所示:

@RunWith(SpringJUnit4ClassRunner.class)
@WebIntegrationTest("server.port:0")
@SpringApplicationConfiguration(classes = DelayedWebServerConfiguration.class)
@ActiveProfiles("restTemplateTimeout")
public class RestTemplateShould {@Rulepublic ExpectedException thrown = none();@Value("${local.server.port}")private int port;@Autowiredprivate RestTemplate restTemplate;@Testpublic void throw_timeout_if_response_lasts_more_than_two_seconds() {thrown.expect(ResourceAccessException.class);thrown.expectCause(instanceOf(SocketTimeoutException.class));callEndpointWithDelay(3000);}@Testpublic void do_not_throw_timeout_if_response_lasts_less_than_two_seconds() {callEndpointWithDelay(10);}private void callEndpointWithDelay(long delayMs) {restTemplate.getForObject("http://localhost:" + port + "/test/delayRestTemplate?waitTimeMs=" + delayMs, String.class);}
}

当然,所有这些类都存储在我们的测试源文件夹(通常为src/test/java )中,因为生产不需要它们。

让我们再看一下注解:

  • @RunWith :测试将使用Spring Junit运行程序,该运行程序将负责为我们创建Spring上下文。
  • @WebIntegrationTest :告诉Spring这是一个运行Web应用程序的集成测试,否则默认情况下Spring不会在测试模式下运行HTTP服务器。 我们还将server.port的值设置为0以便Spring Boot选择一个随机端口供HTTP服务器监听。 这允许并行运行多个测试,或者在后台运行该应用程序的另一个版本。
  • @SpringApplicationConfiguration :我们告诉Spring在哪里可以找到我们之前创建的DelayedWebServerConfiguration类。
  • @ActiveProfiles :启用restTemplateTimeout配置文件,否则ControllerConfiguration将被过滤掉。

现在,我们有一个集成测试,它以一组有限的依赖关系而不是整个应用程序运行。 如果我们想走得更远并在游戏中添加模拟游戏怎么办? 当依赖项没有开发环境,或者过于复杂而无法从开发人员的工作站调用时,可能需要这样做。 在这种情况下,我们可以将这些模拟添加到Configuration类中,并将它们注入到测试的Spring上下文中。

这是一个Configuration示例,在该示例中,我们注入了一个由Mockito模拟的自定义CustomerService ,而不是默认值:

@Profile("validationTests")
@Configuration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@ComponentScan(basePackages = {"my.application.controller","my.application.actions"})
public class ValidationEndToEndConfiguration {@Beanpublic CustomerService customerService() {return Mockito.mock(CustomerService.class);}
}

通过这种方法,我们可以使集成测试更具弹性。 对于缓慢或不可靠的依赖关系,让开发人员针对模拟版本运行集成测试会更加有效。 但是,不要忘记,最终您的应用程序将必须与实际系统集成,而不是与模拟系统集成。 因此,让持续集成服务器至少每天都在真实系统上运行测试是有意义的。

翻译自: https://www.javacodegeeks.com/2016/02/isolating-integration-tests-mocking-dependencies-spring-boot.html

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

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

相关文章

Ubuntu 16.04下使用Wine安装Xshell 4和Xftp 4

说明: 1、使用的Wine版本是深度出品(Deepin),已经精简了很多没用的配置,使启动能非常快,占用资源小。 2、由于Xshell 5的C库无法在这个Wine版本运行,即使升级官方原版的2版本也无法解决&#xf…

电脑缺失MSVCP110.dll文件

安装某软件显示如下错误。 错误: 原因:电脑缺少MSVCP110.dll系统文件。C:\Windows\System32目录下没有此文件。 解决: 下载vcredist_x64直接双击安装,安装完成后就可以继续安装之前安装不了的软件了。。 这里是我下载的&#…

在WildFly的REST Web服务中与Jackson的双向关系

这是使用Jackson的REST Web服务中Java实体之间的双向关系的示例。 假设我们在两个实体Parent和Child之间存在双向关系。 使用MySQL工作台为这两个表生成SQL模式文件。 DROP SCHEMA IF EXISTS bidirectional_schema ; CREATE SCHEMA IF NOT EXISTS bidirectional_schema DEFA…

Postman安装与使用(网络请求神器)--post、get请求

安装 1、Postman最早是作用chrome浏览器插件存在的,所以,你可以到chrome商店搜索下载安装,因为重所周知的原因,所以,大家都会找别人共享的postman插件文件来安装。由于2018年初Chrome停止对Chrome应用程序的支持。 官…

openshift用户管理_OpenShift Express Web管理控制台:入门

openshift用户管理本周, 最新版本的OpenShift为已经很棒的PaaS Cloud提供商带来了两个非常好的功能。 首先,JBoss AS已从7.0升级到7.1,并且所有新的Express Web Management Console已作为预览发布。 在本文中,我们将研究如何使用此…

linux系统搭建ftp服务器--只给某个用户访问其默认目录下的文件

1、环境: window操作系统中安装FlashFXP 软件或xftp; 服务器端的操作系统为centos8; 2、检查安装vsftpd软件 查看所有的安装的软件包 并在结果中查找包含vsftp 的文件 rpm -qa | grep vsftpd如果没有装则使用yum命令安装 yum -y install vsftpd3、创…

Openshift源中的高可用性Drools无状态服务

嗨,大家好! 在这篇博客文章中,我想举一个简单的例子,展示使用Openshift 3(Docker和Kubernetes)扩展Drools Stateless服务有多么容易。 我将展示如何通过按需提供新实例来扩展我们的服务,以及如何…

jpa jsf_完整的Web应用程序Tomcat JSF Primefaces JPA Hibernate –第1部分

jpa jsf我们创建了这篇文章,将展示如何使用以下工具创建完整的Web应用程序:Tomcat7,带有Primefaces的JSF2(Facelets和Libraries)(具有AutoComplete),JPA / Hibernate(具有…

错题

1. 本题考查String对象的声明和赋值方式。C#中没有new String() 这种方式来构造字符串。故选 AC 2. 在CSS中,控制列表样式的属性有:list-style-type,list-style-position,list-style-image,list-style equals比较的是像…

javascript-发布订阅模式

说明:本篇文章转载自小火柴的蓝色理想的一篇博文。原文地址:http://www.cnblogs.com/xiaohuochai/p/8031564.html 发布—订阅模式又叫观察者模式,它定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖…

python-列表list和元组tuple

list Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。 比如,列出班里所有同学的名字,就可以用一个list表示: >>> classmates [Michael, Bob, Tracy] >>&g…

jsf表单验证_动态表单,JSF世界期待已久

jsf表单验证新的PrimeFaces扩展版本0.5.0带来了新的DynaForm组件。 通常,如果知道行/列的数量,元素的位置等,则可以通过h:panelGrid或p:panelGrid构建非常简单的表单。 静态表单是正确的。 但是,如果在运行…

转载黑客是如何黑到你手机的?绝对涨姿势,一位黑客的Wi-Fi入侵实录!

声明:这是一虚构的故事,因此对图片均进行了模糊化处理。内容整理自网络! 故事的主人公小黑是一名从事IT相关工作的技术宅男。五一长假来临,宅在家中的他相当无聊,打开手机上的Wi-Fi模块,发现附近有将近10个…

html5——DOM扩展

元素获取 1、document.getElementsByClassName (class) 通过类名获取元素,以类数组形式存在。 2、document.querySelector(‘div’) 通过CSS选择器获取元素,符合匹配条件的第1个元素。 3、document.querySelectorAll(selector) 通过CSS选择器获取元素&am…

JAVA递归实现全排列

全排列(permutation) 排列组合概念 排列,就是指从给定n个数的元素中取出指定m个数的元素,进行排序 组合,则是指从给定n个数的元素中仅仅取出指定m个数的元素,不考虑排序 全排列 以数字为例,全排…

java云端部署_Jelastic Java云端平台

java云端部署谁在Jelastic背后? 那是我的第一个问题,因此我浏览了Jelastic网站。 回答此问题的最佳方法是查看“ Jelastic团队”部分。 创始人,顾问,特殊合作伙伴构成了一支真正的专业团队。 作为特殊的合作伙伴,您会…

Spring Bootstrap中带有配置元数据的高级配置

在简要介绍了配置元数据并涵盖了我之前的文章《 在Spring Boot中使用配置元数据Pimp您的配置》中的基础知识之后,是时候看看如何进一步执行此步骤并进一步自定义配置了。 在本文中,我计划提出对配置属性的弃用,并讨论各种值提供程序&#xff…

windows系统服务器添加ssl证书

一、为域名申请证书 浏览器打开后系在对应版本: https://keymanager.org/ 注册账号: https://freessl.cn/ 安装刚刚下载的软件; 登录进去就可以申请域名的证书了 二、域名解析 解析完后倒回软件那点击“配置完成,检查一下” …

使用ANTLR在5分钟内用Java解析任何语言:例如Python

我喜欢出于多种目的处理代码,例如静态分析或自动重构。 对我来说,有趣的部分是推理从抽象语法树(AST)构建的模型。 为此,您需要一种从源文件中获取AST的方法。 使用ANTLR和完整的语法集合可在此处轻松完成:…

linux服务器配置ssl证书

一、申请ssl证书 这里有申请域名的ssl证书的步骤: https://blog.csdn.net/weixin_38797742/article/details/109471250 二、配置服务器 打开项目对应的配置文件,配置图中三行信息,端口、还有申请的证书的所在目录。 listen 443 ssl; ssl_…