junit5_在JUnit中测试预期的异常

news/2024/7/24 11:52:36 标签: 单元测试, java, python, exception, junit
<a class=junit5" width="403px" height="256px" style="outline: none;" />

junit5

单元测试用于验证一段代码是否按照开发人员的预期运行。 有时,这意味着检查代码是否也会引发预期的异常。 JUnit是Java单元测试的标准,并提供了几种验证抛出异常的机制。 本文探讨了这些选项及其相对优点。以下面的简单代码段为例。 除了编写测试以确保canVote()方法返回true或false之外,您还应该编写测试以验证是否在期望时抛出IllegalArgumentException

java">public class Student {
        public boolean canVote(int age) {
            if (i<=0) throw new IllegalArgumentException("age should be +ve");
            if (i<18) return false;
            else return true;
        }
    }

(番石榴前提条件可能更适合于这些参数检查,但该示例仍然有效)。

有3种常见的方法可以检查是否引发了异常,每种方法都有其自身的优缺点。

1)@Test(预期...)

@Test批注具有一个可选参数“ expected”,该参数允许您指定Throwable的子类。 如果我们想验证上面的canVote() ()方法抛出正确的异常,我们将编写:

java">@Test(expected = IllegalArgumentException.class)
    public void canVote_throws_IllegalArgumentException_for_zero_age() {
        Student student = new Student();
        student.canVote(0);
    }

简单明了(如果有点不精确),因为它测试将异常抛出到方法的某个地方,而不是放在特定的行上。

2)ExpectedException

要使用JUnit的ExpectedException ,首先需要声明ExpectedException:

java">@Rule
    public ExpectedException thrown= ExpectedException.none();

然后,您可以使用仅指定预期异常的更简单方法:

java">@Test
    public void canVote_throws_IllegalArgumentException_for_zero_age() {
        Student student = new Student();
        thrown.expect(NullPointerException.class);
        student.canVote(0);
    }

或者也可以指定预期的异常消息:

java">@Test
    public void canVote_throws_IllegalArgumentException_for_zero_age() {
        Student student = new Student();
        thrown.expect(IllegalArgumentException.class);
        thrown.expectMessage("age should be +ve");
        student.canVote(0);
    }

除了可以指定预期的异常消息之外,此ExpectedException方法还具有使您可以更精确地了解预期将在何处引发异常的优点。 在上面的示例中,在构造函数中引发意外的IllegalArgumentException会导致测试失败,因为我们希望测试能够在canVote()方法中引发。

附带说明一下,如果不需要声明,那就太好了:

java">@Rule public ExpectedException thrown= ExpectedException.none();

好像是不必要的噪音。 能够做的很好

java">expect(RuntimeException.class)

要么

java">expect(RuntimeException.class, “Expected exception message”)

或至少能够在一次对ExpectedException的调用中传递异常和消息:

java">thrown.expect(IllegalArgumentException.class, “age should be +ve”);

3)尝试/抓住断言/失败

在JUnit4之前,检查异常的方法是使用try / catch块。

java">@Test
    public void canVote_throws_IllegalArgumentException_for_zero_age() {
        Student student = new Student();
        try {
            student.canVote(0);
        } catch (IllegalArgumentException ex) {
            assertThat(ex.getMessage(), containsString("age should be +ve"));
        }
        fail("expected IllegalArgumentException for non +ve age");
    }

尽管这是一种较旧的方法,但仍然完全有效。 主要缺点是,很容易忘记将fail()放在catch后面,如果未引发预期的异常,则会导致误报。 我过去肯定犯了这个错误!

总之,有三种主要的方法可以测试预期的异常,每种方法都有其自身的优缺点。 就我个人而言,由于它的精确度和测试异常消息的能力,我通常倾向于ExpectedException方法。

参考:来自Shaun Abram博客博客的JCG合作伙伴Shaun Abram在JUnit中测试了预期的异常。

翻译自: https://www.javacodegeeks.com/2014/02/testing-for-expected-exceptions-in-junit.html

junit5


http://www.niftyadmin.cn/n/1707965.html

相关文章

Java学习笔记13(理解初始化块和abstract)

文章目录初始化块非静态代码块&#xff1a;没有static修饰的代码块静态代码块&#xff1a;用static 修饰的代码块匿名类&#xff08;静态代码块的作用&#xff09;关键字final抽象类模板方法设计模式(TemplateMethod)初始化块 代码块&#xff1a; { xxxx } 初始化块是对构造器…

mockito_使用Mockito测试Spring组件

mockito我认为&#xff0c;能够对弹簧组件进行单元测试而无需使用临时测试配置加载完整的弹簧上下文&#xff0c;这是一个很大的优势&#xff0c;因为它干净&#xff0c;易于维护&#xff0c;编写速度更快&#xff0c;更改平滑。 实现此目标的一种方法是使用Mockito并告诉他用M…

Java学习笔记14(接口+工厂模式)

文章目录接口接口的特点&#xff1a;**为什么要接口**工厂模式接口 Java不支持多重继承。有了接口&#xff0c;就可以得到多重继承的效果。 接口(interface)是抽象方法和常量值的定义的集合。 从本质上讲&#xff0c;接口是一种特殊的抽象类&#xff0c;这种抽象类中只包含常量…

activiti_在Activiti中执行自定义查询

activiti(这可能最终会出现在Activiti 5.15版本的用户指南中&#xff0c;但是我已经想分享它了) Activiti API允许使用高级API与数据库进行交互。 例如&#xff0c;对于检索数据&#xff0c;查询API和本机查询API的用法很强大。 但是&#xff0c;对于某些用例&#xff0c;它们可…

Java学习笔记15(详细代码讲解异常)

文章目录异常异常概述异常处理机制使用 try…catch…finally 处理异常声明抛出异常人工抛出异常创建用户自定义异常类异常 RuntimeException 错误的类型转换 数组下标越界 空指针访问IOExeption 从一个不存在的文件中读取数据**FileNotFoundException** 越过文件结尾继续读取…

undertow_进入Undertow Web服务器

undertow随着Java EE 7的到来以及处理诸如Web Sockets API和HTTP升级(例如EJB over HTTP)之类的高级功能的要求&#xff0c;WildFly开发团队已经做出了重要决定。 在长期致力于JBoss Web服务器(Apache Tomcat的一个分支)之后&#xff0c;新版本的应用程序服务器现在基于名为Und…

Python科学计算(Numpy基础练习题)

Numpy 练习题 1、arr11 5-np.arange(1,13).reshape(4,3), 计算所有元素及每一列的和&#xff1b;对每一 个元素、每一列求累积和&#xff1b;计算每一行的累计积&#xff1b;计算所有元素的最小值&#xff1b;计算 每一列的最大值&#xff1b;计算所有元素、每一行的均值&…

linux下pkg.tar,Linux packages 的本地打包

首先生成对应程序PKGBUILD脚本&#xff0c;并将需要的程序放到同级目录下。在PKGBUILD脚本所在目录执行makepkg&#xff0c;因为程序已经存在&#xff0c;所以直接就开始编译了。如果安装程序不存在的话&#xff0c;makepkg开始自动下载linux-fetion的源码&#xff0c;并开始编…