junit规则_JUnit规则

junit规则

介绍

在本文中,我想展示一个示例,说明如何使用JUnit Rule简化测试。

最近,我继承了一个相当复杂的系统,并未对所有内容进行测试。 甚至经过测试的代码也很复杂。 通常,我看到缺乏测试隔离。 (我将写一个关于使用Legacy Code的不同博客)。

我正在修复的测试(和代码)之一实际上是将多个组件一起测试。 它还连接到数据库。 它测试一些逻辑和组件之间的交集。 如果代码没有在完全不同的位置编译,则测试无法运行,因为它加载了所有Spring上下文。 其结构是在测试(任何类)之前启动所有Spring上下文。 这些测试扩展了BaseTest,该加载了所有Spring上下文。

BaseTest还使用@After方法清除数据库。

重要说明:本文是关于更改测试的,并非结构完全正确。 在创建新代码和测试时,应该将它们隔离,一事不做。更好的测试应该使用模拟数据库/依赖项等。修复测试和重构后,我将充满信心进行更多更改。

回到我们的话题…

因此,我得到的是测试套件运行缓慢,没有隔离,甚至由于不相关的问题而导致测试运行出现问题。 因此,我决定将数据库连接的上下文加载与清理数据库分开。

方法

为了实现这一点,我做了三件事:首先是更改测试类的继承。 它停止继承BaseTest。 相反,它继承了AbstractJUnit4SpringContextTests现在,我可以为每个测试创建自己的上下文,而不加载所有内容。

现在我需要两个规则,@ClassRule和@Rule @ClassRule将负责数据库连接@Rule将在每次测试之后/之前清理数据库。

但是首先, 什么是JUnit规则?
简短的解释是,它们提供了拦截测试方法的可能性,类似于AOP概念。 @Rule允许我们在方法实际运行之前和之后拦截方法。 @ClassRule拦截测试类的运行。 一个非常有名的@Rule是JUnit的TemporaryFolder

(类似于@ Before,@ After和@BeforeClass)。

创建@Rule

最简单的部分是创建一个在测试方法之前和之后清理数据库的规则。 您需要实现TestRule ,它具有一种方法: 语句apply(Statement base,Description description); 你可以做很多。 我发现通常我会有一个扩展Statement的内部类。 我创建的规则并未创建数据库连接,而是在构造函数中获得了它。

这是完整的代码:

public class DbCleanupRule implements TestRule {private final DbConnectionManager connection;public MongoCleanupRule(DbConnectionManager connection) {this.connection = connection;}@Overridepublic Statement apply(Statement base, Description description) {return new MongoCleanupStatement(base, connection);}private static final class DbCleanupStatement extends Statement {private final Statement base;private final DbConnectionManager connection;private MongoCleanupStatement(Statement base, DbConnectionManager connection) {this.base = base;this.connection = connection;}@Overridepublic void evaluate() throws Throwable {try {cleanDb();base.evaluate();} finally {cleanDb();}}private void cleanDb() {connection.doTheCleanup();}}
}

创建@ClassRule

ClassRule实际上也是TestRule。 与Rule的唯一区别是我们在测试代码中如何使用它。 我将在下面显示。

创建此规则的挑战在于,我想使用Spring上下文来获取正确的连接。
这是代码:
(ExternalResource是TestRule)

public class DbConnectionRule extends ExternalResource {private DbConnectionManager connection;public DbConnectionRule() {}@Overrideprotected void before() throws Throwable {ClassPathXmlApplicationContext ctx = null;try {ctx = new ClassPathXmlApplicationContext("/META-INF/my-db-connection-TEST-ctx.xml");mongoDb = (DbConnectionManager) ctx.getBean("myDbConnection");} finally {if (ctx != null) {ctx.close();}}}@Overrideprotected void after() {}public DbConnectionManager getDbConnecttion() {return connection;}
}

(您是否看到我可以使DbCleanupRule继承ExternalResource?)

使用它

最后一部分是我们如何使用规则。 @Rule必须是公共字段。 @ClassRule必须是公共静态字段。

那里是:

@ContextConfiguration(locations = { "/META-INF/one-dao-TEST-ctx.xml", "/META-INF/two-TEST-ctx.xml" })
public class ExampleDaoTest extends AbstractJUnit4SpringContextTests {@ClassRulepublic static DbCleanupRule  connectionRule = new DbCleanupRule ();@Rulepublic DbCleanupRule dbCleanupRule = new DbCleanupRule(connectionRule.getDbConnecttion()); @Autowiredprivate ExampleDao classToTest;@Testpublic void foo() {}
}

就这样。
希望能帮助到你。

翻译自: https://www.javacodegeeks.com/2014/09/junit-rules-3.html

junit规则

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

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

相关文章

mysql server 5.0安装教程_MySQL Server 5.0安装教程

运行MySQL Server 5.0安装程序“setup.exe”,出现如下界面:安装向导启动,按“Next”继续:选择安装类型,为了方便熟悉安装过程,我们选择“Custom”。按“Next”继续:在“Developer Components”上…

Kubernetes集群上的Apache Ignite和Spring第2部分:Kubernetes部署

以前,我们已经成功创建了第一个由Apache Ignite支持的Spring boot Application。 在此博客上,我们将重点介绍Kubernetes方面需要做的事情,以便能够启动我们的应用程序。 如先前博客所述,我们需要制定我们的Kubernetes RBAC策略。…

centos6.5 安装多个mysql_在centos6,5(64位)系统安装多实例mysql5.6

首先你安装个单实例的mysql试一试一 检查你电脑之前是否装了mysqlrpm -qa | grep mysql这条命令只是查看你系统是否使用过yum或者rpm包安装mysql,对用源码包安装的mysql是查不到的,所以基本用不到二 安装编译所需的包yum -y install make gcc-c cmake bi…

hibernate jpa_JPAHibernate替代方案。 如果JPA或Hibernate对于我的项目而言不够好,该怎么办?...

hibernate jpa你好!你好吗? 今天我们将讨论不建议使用JPA / Hibernate的情况。 在JPA领域之外,我们还有哪些选择? 我们将谈论的是: JPA /Hibernate问题 解决一些JPA /Hibernate问题的方法 选择此处描述的框架的标准…

mysql中常见查询表_MySQL中常见查询

1 --1、查询“001”课程比“002”课程成绩高的所有学生的学号;2 SELECT a.s FROM sc a,sc b WHERE a.sb.s AND a.c1 AND b.c2 AND a.score >b.score;3 --2、查询平均成绩大于60分的同学的学号和平均成绩;4 SELECT student.s,avg(score) FROM student,…

约束流–没有Drools规则语言的现代Java约束

传统上,要使用OptaPlanner进行扩展,您必须学习DRL。 不再。 借助受Java 8 Streams和SQL启发的新Constraints Streams API,您现在可以用Java (或Kotlin或Scala) 编写约束,并且仍然可以从增量计算中受益。 在…

mysql数据库杀掉堵塞_Mysql解决USE DB堵塞详解

遇到故障,我们往往想的是如何解决这个故障,而不是从故障的根本去思考出现这个故障的原因?这样的结果,只能使我们得到了鱼,失去了渔。今天,我们就来分享一个由USE DB堵塞故障引发的思考案例。故障描述今天一…

java拦截器项目应用_使用拦截器分析Java EE应用程序的性能下降/提高

java拦截器项目应用在开发具有某些性能要求的Java EE应用程序时,必须在每个发行版之前验证是否满足这些要求。 您可能会想到,哈德森的一项工作每天晚上在某些特定的硬件平台上执行一系列测试测量。 您可以检查已实现的时间并将它们与给定的要求进行比较…

iis web.config 配置 经典模式_django部署在iis下,webconfig错误

django部署在iis下,webconfig错误错误原因:iis7以后,web.config管理机制更安全了默认情况下,会锁住配置项,不许修改怎么办?如何求解以上问题呢?D:django_websiteshello>%windir%C:Windows 不…

如何在Java中验证电话号码(正则表达式+ Google libphonenumber)

关于如何在不同国家(例如美国,美国)使用Java验证电话号码的快速指南。 带有正则表达式和Google libphonenumber API的示例程序。 1.简介 在本教程中,我们将学习如何在java中验证电话号码 。 这主要是为了验证美国和印度的国家/地…

mysql该账户已存在_mysql 查看函数的所属用户和已存在的函数

复现方式:Delete FROM user Where Usertest and Host%;flush privileges;修复流程:1.用root用户删除两个函数,语句分别为DROP FUNCTION IF EXISTS currval;DROP FUNCTION IF EXISTS nextval;2.然后用程序用户(sharding_slave)创建函数&#x…

joo工作流_不要错过使用jOOλ或jOOQ编写Java 8 SQL单行代码的机会

joo工作流越来越多的人通过为他们的业务采用功能性编程来赶上我们平台的最新更新。 在Data Geekery ,我们将Java 8用于jOOQ集成测试,因为将新的Streams API与lambda表达式一起使用使生成临时测试数据变得非常容易。 但是, 我们并不认为JDK提…

session mysql登录实现_PHP+MYSQL+MYSQL+SESSION实现用户登录的实例

这是我写的用户登录界面。session_start();include(menu2.php);require(configywcl.php);//加载配置文件require(functions.php);?>请登录系统if ($username){$passwordmd5($password);$sql"select * from user where username$username and password$password";…

使用OpenSSL加密,使用Java解密,使​​用OpenSSL RSA公钥

抽象 在2017年,我撰写了一个由三部分组成的系列文章,内容涉及选择最佳的哈希和加密算法。 在对该系列进行研究时,我学到了很多有关哈希和加密的知识。 我学到的最重要的事情是,尽管我必须对如何使用最安全的算法进行自我教育&…

axture动画原型制作_Axure制作原型-基础操作

产品原型从类型可以分为手稿、线框图、低保真、高保真几种效果,在制作的时候分为不同场景来决定我们的输出物类型。比如在会议中为了快速的确定产品规划方向,迅速的记录及表达出当前灵感的碰撞,这个时候通常使用手稿的形式快速绘制&#xff0…

有效Java第三版的源代码已更新为使用较新的功能

那些已经阅读了有效Java 第三版的人可能知道与该书相关的源代码可以在GitHub上获得 。 jbloch / efficiency-java-3e-source-code项目拥有1700多个星星,截至撰写本文时,它已被分叉了近800次。 在有效Java的第三版中, Java的版本主要是JDK 8&a…

mysql 远程连接取消权限_MYSQL远程登录权限设置

Mysql默认关闭远程登录权限,如下操作允许用户在任意地点登录:1. 进入mysql,GRANT ALL PRIVILEGES ON *.* TO root% IDENTIFIED BY WITH GRANT OPTION;IDENTIFIED BY后跟的是密码,可设为空。2. FLUSH privileges; 更新Mysql为了安…

spring和spring_Spring WebApplicationInitializer和ApplicationContextInitializer的混淆

spring和spring我偶尔会混淆这两个概念-WebApplicationInitializer和ApplicationContextInitializer,并希望描述它们中的每一个,以便为我自己澄清它们。 我以前曾在这里写过有关WebApplicationInitializer的博客。 它仅在符合Servlet 3.0规范的Servlet容…

mybatis mysql demo_SpringBoot(入门Demo,整合mybatis,连接mysql)

1.简介SpringBoot提供一种固定的、约定优于配置风格的框架,使开发者更快地创建基于spring的应用和程序。可以高效的创建基于Spring的应用服务(SpringBoot不是对spring功能的增强,而是可以更快速使用spring)。为微服务spring cloud铺路,可整合…

HttpClient 4 API –获取状态码-getStatusLine()。getStatusCode()示例

在HttpClient API中获取状态代码的快速指南。 getStatusLine()。getStatusCode()示例和相关的错误。 1.简介 在这个非常快速的教程中,我将展示如何使用HttpClient 4获取和验证HTTP响应的StatusCode。 2. Maven依赖 要…