首页 文章

使用JUnit 4注释测试多个异常

提问于
浏览
24

是否可以在单个JUnit单元测试中测试多个异常?例如,我知道可以使用一个例外

@Test(expected=IllegalStateException.class)

现在,如果我想测试另一个异常(例如,NullPointerException),可以在相同的注释,不同的注释中完成,还是需要完全编写另一个单元测试?

7 回答

  • 22

    你真的希望测试做一件事,并测试它 . 如果你听起来对我来说是一个很好的考验 .

    例如(伪代码)

    try {
       badOperation();
       /// looks like we succeeded. Not good! Fail the test
       fail();
    }
    catch (ExpectedException e) {
       // that's fine
    }
    catch (UnexpectedException e) {
       // that's NOT fine. Fail the test
    }
    

    因此,如果您想测试您的方法抛出2个不同的异常(对于2组输入),那么您将需要2个测试 .

  • 2

    注释无法实现这一点 .

    使用JUnit 4.7,您可以使用新的 ExpectedException 规则

    public static class HasExpectedException {
        @Interceptor
        public ExpectedException thrown= new ExpectedException();
    
        @Test
        public void throwsNothing() {
        }
    
        @Test
        public void throwsNullPointerException() {
             thrown.expect(NullPointerException.class);
             throw new NullPointerException();
        }
    
        @Test
        public void throwsNullPointerExceptionWithMessage() {
            thrown.expect(NullPointerException.class);
            thrown.expectMessage("happened?");
            throw new NullPointerException("What happened?");
        }
    }
    

    更多见


    如果您无法更新到JUnit 4.7,则必须编写表单的裸单元测试

    public test() {
        try {
            methodCall(); // should throw Exception
            fail();
        }
        catch (Exception ex) {
            assert((ex instanceof A) || (ex instanceof B) || ...etc...);
            ...
        }
    

    }

  • 0

    使用catch-exception

    // test 
    public void testDo() {
    
       // obj.do(1) must throw either A or B
       catchException(obj).do(1);
       assert caughtException() instanceof A
           || caughtException() instanceof B;
    
       // obj.do(2) must throw A but not SubclassOfA
       catchException(obj).do(2);
       assert caughtException() instanceof A
           && !(caughtException() instanceof SubclassOfA);
    
    }
    
  • 12

    虽然使用JUnit 4是不可能的,但如果你切换到允许你编写的TestNG,它是可能的

    @Test(expectedExceptions = {IllegalArgumentException.class, NullPointerException.class})
    
  • 0

    您如何期望“预期”的工作?一个方法只能抛出一个异常 .

    您必须为方法失败的每种方式编写不同的单元测试 . 因此,如果该方法合法地抛出两个异常,那么您需要设置两个测试来强制抛出每个异常的方法 .

  • 0

    保持测试尽可能简单和短 . JUnit-Test的目的是仅测试一个简单的功能或一种单一的故障方式 .

    实际上,为了安全起见,您应该为每种可能的执行方式创建至少一个测试 .

    通常,这并不总是可行的,因为如果你有一个分析字符串的方法,那么有很多可能的字符串组合你无法涵盖所有内容 .

    保持简短 .

    您可以轻松地为一种方法提供30-40种测试方法......这真的很重要吗?

    问候

  • 3
    @Test(expected=Exception.class)
    

    这将抛出所有可能的异常 .

相关问题