junit 验证日志输出

在本文中,我将快速向您展示如果您需要解决以下挑战,那么JUnit规则有多方便

一个方法可以捕获异常,并且必须在抛出或引发包装异常之前执行一些额外的任务。
调用额外任务和引发的异常应通过单元测试进行验证。

这意味着你有一些这样的代码

public class MyThrowingClass {private final ExceptionProcessor exceptionProcessor;public MyThrowingClass(ExceptionProcessor exceptionProcessor) {this.exceptionProcessor = exceptionProcessor;}public void runTask() throws NullPointerException {try {// something to do herethrow new NullPointerException("It's null Jim");} catch (NullPointerException e) {exceptionProcessor.process(e); // This call needs to be verifiedthrow e;}}
}

并在这行中调用

exceptionProcessor.process(e);

需要进行验证以及引发异常。

直截了当……但丑陋

我不会详细介绍此变体

try {cut.runMyMethod();
} catch(Exception e) {verify(...);assertThat(e).isInstanceOf();
}

因为我个人尽量避免在测试代码中尝试使用catch结构。

容易的第一

验证引发异常非常容易,JUnit在此处提供了潜在的选项

  1. @Test批注的预期参数和
  2. 一个叫做ExceptionRule的规则

第一个选项看起来像这样

@Test(expected = NullPointerException.class)
public void myTestWithExpectedParameter() throws Exception {// ...
}

第二个像这样

// ...
@Rule
public ExceptionRule exceptionRule = ExceptionRule.none();// ...@Test
public void myTestWithTheExceptionRule() throws Exception {exceptionRule.expect(NullPointerException.class);// ...
}

不,事情变得越来越复杂

上述测试要求背后的问题如下

执行被测方法之后,您执行的所有verify(…)步骤将不会执行,因为如果引发并捕获了异常,异常将照常停止其余测试方法的执行。

JUnit救援规则

借助JUnit规则,即使抛出异常,我们也可以轻松地创建一种提供其他验证步骤的方法。

我知道JUnit已经提供了验证程序规则,但是我不会使用它。 该类的缺点是在设置时会将验证逻辑刻录到其中。

因此,我们需要一个规则,该规则允许我们为每个测试指定在执行测试之后应用的附加验证逻辑。

一般用法如下所示

@Rule
public VerifyRule verifyRule = new VerifyRule();@Mock
ExceptionProcessor exceptionProcessor;@Test()
public void working() throws Exception {verifyRule.setVerifier(() -> verify(exceptionProcessor).process(any()));// ..
}

为了使它运行起来,我们需要做一些事情

  • 验证规则
  • 可以在验证规则上设置的任何类型的回调接口

让我们从回调接口开始

public interface VerifyRuleCallback {void execute() throws Throwable;
}

如您所见,这里没有什么特别的。

现在,让我们专注于VerifyRule

public class VerifyRule implements TestRule {private VerifyRuleCallback verifyRuleCallback;@Overridepublic Statement apply(Statement base, Description description) {return new VerifyRuleStatement(base);}public void setVerifier(VerifyRuleCallback verifyRuleCallback) {this.verifyRuleCallback = verifyRuleCallback;}private class VerifyRuleStatement extends Statement {private final Statement nextStatement;public VerifyRuleStatement(Statement nextStatement) {this.nextStatement = nextStatement;}@Overridepublic void evaluate() throws Throwable {nextStatement.evaluate();verifyRuleCallback.execute();}}
}

如您所见,它实现了TestRule接口,并提供了一种设置VerifyRuleCallback的方法。 然后在需要执行以运行我们自己的回调评估的VerifyRuleStatement的评估方法中使用该回调。

绑在一起

使用新规则和回调,测试可能看起来像这样

public class MyThrowingClassShould {@Rulepublic MockitoRule mockitoRule = MockitoJUnit.rule();@InjectMocksMyThrowingClass cut;@MockExceptionProcessor processor;@Rulepublic ExpectedException exception = ExpectedException.none();@Rulepublic VerifyRule verifyRule = new VerifyRule();@Test()public void execute_the_exception_processor_and_rethrow_the_exception_when_it_occur() throws Exception {verifyRule.setVerifier(() -> verify(processor).process(any(NullPointerException.class)));exception.expect(NullPointerException.class);cut.runTask();}
}

摘要

正如我们已经看到的那样,JUnit规则提供了一种非常好用的简便方法,可以在这种情况下(不仅在这种情况下)创建干净且易于理解的测试代码。

的JUnit 2016-09-26

彼得·道姆(Peter Daum)

翻译自: https://www.javacodegeeks.com/2016/09/junit-rules-executing-additional-verification-exceptions-thrown.html

junit 验证日志输出

junit 验证日志输出_JUnit规则–引发异常时执行附加验证相关推荐

  1. JUnit规则–引发异常时执行附加验证

    在本文中,我将快速向您展示如果您需要解决以下挑战,那么JUnit规则有多方便 方法捕获异常并必须执行一些额外的任务,然后再抛出或引发包装异常. 调用额外任务和引发的异常应通过单元测试进行验证. 这意味 ...

  2. CC00290.CloudKubernetes——|KuberNetes运维.V12|——|EFLK架构.v07|验证日志输出采集是否正常|

    一.验证日志输出采集是否正常 ### --- 进入Filebeat-pod查看是否正常启动 ~~~ 查看Filebeat容器[root@k8s-master01 filebeat]# kubectl ...

  3. 验证多个Filter过滤一个资源时执行顺序

    当有多个Filter过滤一个资源时,执行顺序到底是怎样? 如下测试: 定义两个Filter,FirstFilter,SecondFilter,它们过滤同一个index.jsp页面,并且SecondFi ...

  4. 近期业务大量突增微服务性能优化总结-2.开发日志输出异常堆栈的过滤插件

    最近,业务增长的很迅猛,对于我们后台这块也是一个不小的挑战,这次遇到的核心业务接口的性能瓶颈,并不是单独的一个问题导致的,而是几个问题揉在一起:我们解决一个之后,发上线,之后发现还有另一个的性能瓶颈问 ...

  5. log4j日志输出框架

    什么是log4j框架呢? log4j是一个日志输出框架,用于输出日志的.比如MyBatis的日志就是通过log4j输出的,主流框架都是log4j输出的,Spring框架 也可以通过log4j输出日志! ...

  6. 如何利用Serilog的RequestLogging来精简ASP.NET Core的日志输出

    这是该系列的第一篇文章:在ASP.NET Core 3.0中使用Serilog.AspNetCore. 第1部分-使用Serilog RequestLogging来简化ASP.NET Core的日志输 ...

  7. com.haodf.android,有坑!Android新版QQ获取packageInfo引发异常崩溃

    起因 最近从错误日志中检查到一个异常崩溃: java.lang.RuntimeException: Package manager has died at android.app.ActivityTh ...

  8. 检索方法应该返回#39;null#39;还是无法产生返回值时引发异常? [关闭]

    已关闭 . 这个问题是 基于观点的 . 它当前不接受答案. 想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答. 3年前关闭. 我有一种方法,应该在找到对象后返回它. 如果找不到, ...

  9. 深入理解JVM03--判断对象是否存活(引用计数算法、可达性分析算法,最终判定),Eclipse设置GC日志输出,引用

    本文是基于周志明的<深入理解Java虚拟机> 堆中几乎存放着Java世界中所有的对象实例,垃圾收集器在对堆回收之前,第一件事情就是要确定这些对象哪些还"存活"着,哪些对 ...

最新文章

  1. ASP.NET格式化日期
  2. CCNP ONT LAB之PQ WFQ
  3. 兼顾稳定和性能,58大数据平台的技术演进与实践
  4. Linux shell ==运算符
  5. 大量DelegatingClassLoader类加载器,导致Perm区溢出
  6. HTML块,含样式的标签
  7. CCF201912-2 回收站选址
  8. Windows配置GitBook
  9. Matlab基本知识概况
  10. MIB Browser的使用(附安装包)
  11. CDN加速的四大解决方案
  12. VLAN间的三层通信
  13. 小说作者推荐:张廉合集
  14. 禅与摩托车维修艺术语录摘抄(1)
  15. 面向中国企业关系抽取的双向门控递归单元神经网络
  16. 《计算广告》学习笔记(四)
  17. 鸿蒙实力等级划分,圣墟:三部曲中的等级划分下,荒天帝是否是全文最强者?...
  18. 美团点评2020校招系统开发方向笔试题(编程题题解)
  19. App 瘦身最佳实践
  20. java 中wav文件格式,Wav音频文件格式详解

热门文章

  1. 模板:LGV引理(线性代数)
  2. P3466-[POI2008]KLO-Building blocks【Treap】
  3. P4137-Rmq Problem/mex【莫队,分块】
  4. ssl1222-矩形【图论,并查集】
  5. ssl2295-暗黑破坏神【dp练习】
  6. codeforces1552 D. Array Differentiation(思维+暴力)
  7. C. Code a Trie(Trie+dfs+贪心)
  8. 2017 SEERC Divide and Conquer 树上差分
  9. 深入JVM——OOM异常解析
  10. JVM内存管理------垃圾搜集器参数精解