zoukankan      html  css  js  c++  java
  • 使用JUnit测试预期异常

    Junit单测

    1.被单测的类

    /**
     * 被测试类
     */
    public class Student {
        public boolean canVote(int age) {
            if (age <= 0) throw new IllegalArgumentException("年龄必须大于0");
            if(age >= 150 ) throw new IllegalArgumentException("年龄必须小于等于150");
            if (age <18) return false;
            else return true;
        }
    }

    2.使用@Test(expected ...)注解

    @Test注解有个一个可选的参数,“expected”允许你设置一个Throwable的子类。如果你想要验证上面的canVote方法抛出预期的异常,我们可以这样写:

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

    3.ExpectedException

    使用JUnit框架中的ExpectedException类,可以调用时抛出的异常和异常的message进行精确的匹配,如果被单测方法没有抛出异常、抛出的异常类型不正确、抛出的异常的message不正确都将会被认为失败。使用ExpectedException类需要声明ExpectedException异常。

        @Rule
        public ExpectedException thrown = ExpectedException.none();

    有了上述的声明,就可以在单测方法里以更加简单的方式验证预期的异常:

        @Test
        public void canVote_throws_IllegalArgumentException_for_zero_age2() {
            Student student = new Student();
            thrown.expect(IllegalArgumentException.class);
            thrown.expectMessage("年龄必须大于0"); //设置预期异常的message,传入的字符串不要求 “刚好匹配”,而是只要 “被包含” 就算成功。
            student.canVote(0);
        }

    使用ExpectedException类不仅仅可以更加精确的对异常的属性信息进行匹配,还可以更加精确的找到异常抛出的位置,比如上面的单测方法,如果不是在调用canVote方法抛出异常,而是在初始化 Student对象抛出异常,将会引起测试失败。thrown.expect放在哪行,就表明预期该行以下的代码段将会抛出预期异常。这样精确的测试代码块,避免被其他与考虑到但是抛出同类型异常的代码段误导单测结果。

    4.使用junit.Assert.fail进行异常测试

    测试点:没有抛出异常或者抛出的异常类型不正确

        @Test
        public void canVote_throws_IllegalArgumentException_for_zero_age3() {
    
            try {
                Student student = new Student();
                student.canVote(0);
                fail("年龄必须大于0");
            } catch (IllegalArgumentException ex) {
                assertThat(ex.getMessage(), containsString("年龄必须大于0"));
                assertTrue(ex instanceof  IllegalArgumentException);
            }
        }

     总结:

     个人倾向于第三种方法(使用ExpectedException类)可以精确匹配异常抛出的位置 防止被其他代码块抛出同样的异常而误导单测结果。

    原文地址:

     1. 使用JUnit测试预期异常

     2.JUnit 判断 是否有异常抛出 异常类型是否正确 以及 异常的message 是否正确

     

  • 相关阅读:
    《结对-贪吃蛇游戏-最终程序》
    《团队-科学计算器-模块测试过程》
    Bootstrap
    Angularjs的核心概念
    jQuery Ajax
    浏览器为什么会有兼容性问题
    BFC
    sass
    HTML5
    面向过程和面向对象编程
  • 原文地址:https://www.cnblogs.com/boothsun/p/5713523.html
Copyright © 2011-2022 走看看