在JUnit中断言异常

时间:2016-12-08 04:04:14

标签: java junit

我需要编写一个JUnit测试用例,它将测试一个传递不同排列的函数,并得到相应的结果。
成功的用例不返回任何内容,而失败的排列会抛出异常(异常类型无关紧要)。

例如。 testAppleisSweetAndRed(水果,颜色,味道)
测试将调用以下内容 -

testAppleisSweetAndRed(orange,red,sweet)//throws exception
testAppleisSweetAndRed(apple,green,sweet)//throws exception
testAppleisSweetAndRed(apple,red,sour)//throws exception
testAppleisSweetAndRed(apple,red,sweet)//OK

如果调用的行为符合预期,则测试成功 断言如何捕获前3次调用以确保它们确实引发预期的异常?

3 个答案:

答案 0 :(得分:6)

如果您使用的是JUnit 4或更高版本,则可以按照以下方式执行此操作。

可以使用

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

这提供了许多可用于改进JUnit测试的功能。
如果您看到以下示例,我正在测试异常中的3件事。

  1. 抛出的异常类型
  2. 例外消息
  3. 异常原因

  4. public class MyTest {
    
        @Rule
        public ExpectedException exceptions = ExpectedException.none();
    
        ClassUnderTest testClass;
    
        @Before
        public void setUp() throws Exception {
            testClass = new ClassUnderTest();
        }
    
        @Test
        public void testAppleisSweetAndRed() throws Exception {
    
            exceptions.expect(Exception.class);
            exceptions.expectMessage("this is the exception message");
            exceptions.expectCause(Matchers.<Throwable>equalTo(exceptionCause));
    
            testClass.appleisSweetAndRed(orange,red,sweet);
        }
    
    }
    

答案 1 :(得分:5)

告诉您的测试方法您期望形成测试方法的异常类型。你只需要写下面的语法。

@Test(expected = Exception.class) 

这意味着我期待从测试中抛出异常。您可以使用其他异常,例如ArrayOutOfBound等。

答案 2 :(得分:0)

我认为expected不够或不够的标准方法是在测试类中使用辅助方法,如:

private static void testAppleIsSweetAndRedThrowsException(Fruit fruit, Colour colour, Taste taste) {
    try {
        testAppleisSweetAndRed(fruit, colour, taste);
        fail("Exception expected from " + fruit + ", " + colour + ", " + taste);
    } catch (Exception e) {
        // fine, as expected
    }
}

现在在你的测试中你可以写:

    testAppleIsSweetAndRedThrowsException(orange, red, sweet);
    testAppleIsSweetAndRedThrowsException(apple, green, sweet);
    testAppleIsSweetAndRedThrowsException(apple, red, sour);