关于java:在JUnit中断言异常

Asserting exception in JUnit

本问题已经有最佳答案,请猛点这里访问。

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

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

1
2
3
4
testAppleisSweetAndRed(orange,red,sweet)//throws exception
testAppleisSweetAndRed(apple,green,sweet)//throws exception
testAppleisSweetAndRed(apple,red,sour)//throws exception
testAppleisSweetAndRed(apple,red,sweet)//OK

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


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

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

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

  • 抛出的异常类型
  • 消息例外
  • 异常的原因
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    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
    @Test(expected = Exception.class)

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


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

    1
    2
    3
    4
    5
    6
    7
    8
    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
        }
    }

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

    1
    2
    3
        testAppleIsSweetAndRedThrowsException(orange, red, sweet);
        testAppleIsSweetAndRedThrowsException(apple, green, sweet);
        testAppleIsSweetAndRedThrowsException(apple, red, sour);