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规则

junit规则_JUnit规则相关推荐

  1. junit规则_jUnit:规则

    junit规则 规则在测试,测试用例或测试套件周围增加了特殊处理. 他们可以对该类中的所有测试执行通用的其他验证,并发运行多个测试实例,在每个测试或测试用例之前设置资源,然后在之后拆除它们. 该规则可 ...

  2. junit测试起名字规则_如何在JUnit 5中替换规则

    junit测试起名字规则 最近发布的JUnit 5(又名JUnit Lambda) alpha发行版引起了我的兴趣,在浏览文档时,我注意到规则以及运行程序和类规则都消失了. 根据文档,这些部分竞争的概 ...

  3. junit:junit_JUnit ExpectedException规则:超越基础

    junit:junit JUnit测试中有多种处理异常的方法. 正如我在以前的一篇文章中所写的那样 ,我最好的方法是使用org.junit.rules.ExpectedException规则. 基本上 ...

  4. Sentinel授权规则及规则持久化

    授权规则 授权规则可以对请求方来源做判断和控制. 授权规则 基本规则 授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式. 白名单:来源(origin)在白名单内的调用者允许访问 黑名单:来源 ...

  5. python RE表达式规则剩余规则

    前面我学习了 '.' '^' '$' '*' '+' '?'  基本针对单个字符的,学习python 表达式规则剩余规则. 1,{m} 匹配前一个字符m次 2,{n,.m} 匹配前一个字符n到m次 3 ...

  6. 数值积分: 梯形规则--复合梯形规则--辛普森规则--复合辛普森规则--龙贝格求积公式

    数值积分:梯形规则--复合梯形规则--辛普森规则--复合辛普森规则--龙贝格求积公式 1.问题描述 微积分方法求积有很大的局限性,当碰到被积函数很复杂时,找不到相应的原函数.积分值 在几何上可解释为由 ...

  7. 根据编号规则生成规则编号

    /*** 根据编号规则生成规则编号* @param rule 前缀* @param num 数字位数* @param orderField 排序字段* @param table 表名* @param ...

  8. sentinel 1.8. 2持久化Nacos动态规则热点规则和授权规则不生效的问题

    sentinel 1.8.2 持久化Nacos动态规则热点规则和授权规则不生效的问题 问题:规则持久化到nacos之后,我在本地测试时候只有热点和授权规则不生效,我慢慢的在客户端sentinel-cs ...

  9. uBlock的动态规则过滤规则书写

    uBlock具有动态和静态两种规则,但是它比之前的ABP等规则过滤规则强的地方就在于他的动态规则,静态规则的语法继承与ABP,有兴趣的可以去看ABP的过滤规则https://adblockplus.o ...

最新文章

  1. Linux运维人员-服务器组成硬件基础
  2. Python+selenium 自动化 - 实现自动导入、上传外部文件实例演示
  3. linux 启动流详解
  4. java验证只能输入数字和字母_java:为什么我做的验证只能验证数字和字母不重复,不能验证汉字不重复...
  5. 特殊情形的Riemann引理
  6. 黑莓Z10忘记BBID密码导致手机锁定解决方案
  7. 云空间插虾米html音乐,总结一下可以上传MP3并外链的空间
  8. Python Scrapy爬虫报错-Spider error processing
  9. centos 中 Discuz 论坛模板配置问题
  10. java时间戳转换工具类
  11. (西工程-金花)小米路由器连接哆点设置WiFi保姆式教程
  12. 联想微型计算机c325参数,联想一体机c325性能表现 联想一体机c325配置参数
  13. python openssl 证书加解密过程感觉是这样
  14. mysql 字段中有括号的查询方法
  15. linux命令part,技术|十个鲜为人知的 Linux 命令-Part 3
  16. 2018年9月12日
  17. fufu笔记之多线程
  18. dmx512 java,stm32 DMX512核心代码
  19. 禅道讲义之超级管理员
  20. 棋牌游戏开发--如何选择棋牌开发商

热门文章

  1. jzoj6309-完全背包【贪心,背包】
  2. 【dfs】通行证(jzoj 2013)
  3. 2018 计蒜之道 复赛
  4. 面试官问:为什么 Java 线程没有 Running 状态?我懵了
  5. java中你知道的这四种代码块吗?
  6. 《金色梦乡》金句摘抄(九)
  7. Gradle 简单使用
  8. JS删除之前弹出一个带有确认和取消按钮的提示框confirm()
  9. 2016蓝桥杯省赛---java---B---8(四平方和)
  10. 2015蓝桥杯省赛---java---B---3(三羊献瑞)