JUnit @Rule ExpectedException

时间:2016-03-13 11:47:25

标签: java junit error-handling

我一直在尝试使用JUnit预期的Exception来验证我自己的应用程序异常,但每当我尝试使用它时,编译器会抱怨存在未捕获的异常。

@Rule public ExpectedException invalidInputException1= ExpectedException.none();
@Test (expected = WarehouseException.class)
public void testRunProblem_withInvalidInput1() {
    System.out.println("Warehouse Problem: "+INVALID_INPUT_EXAMPLE1);
    Warehouse instance = new Warehouse();
    instance.setDefault();
    invalidInputException1.expect(WarehouseException.class);
    invalidInputException1.expectMessage("ERROR - INVALID INPUT: "+INVALID_INPUT_EXAMPLE1+Errors.INVALID_INPUT_TEXT_EMPTY);


    throw new WarehouseException("");
}

问题出现在throw new WarehouseException("")上,只是抱怨以下内容:

enter image description here

关于该方法应该处理JUnit Javadocs异常这一事实的进一步辩论促使我尝试了所提出的问题,结果如下:

enter image description here

enter image description here

我认为这是错误的是Java正在处理异常,因为JUnit可以访问它以评估它,从而忽略了我期望在测试期间发生异常的事实。

2 个答案:

答案 0 :(得分:3)

ExpectedException不会让你免于声明(或捕获,但在这种情况下,你想声明)异常,如果它是"已检查"例外(换句话说,如果它没有扩展RuntimeException)。换句话说,您的方法必须如下所示......

public void testRunProblem_withInvalidInput1() throws WarehouseException {
...
}

ExpectedException仅处理您的测试用例("如果抛出WarehouseException,则不会失败,但只有在不抛出等等的情况下才会失败等等),但方法本身必须是正确的Java,并且如果你抛出检查过的异常,你必须捕获或声明它,这是Java的要求。在这种情况下,您要声明它 - 因为它将被抛出然后被ExceptedException捕获(它有效地包裹在您的测试用例方法中,这些测试规则是如何工作的)。

@Test带注释的方法可以包含您想要的任何throws声明,这是完全正常的。在不使用ExpectedException TestRule@Test(expected=...)的情况下,任何实际抛出的异常都会导致测试方法失败并出现错误。但是throws只是声明了哪些例外可以被抛出,这并不意味着它们必须被抛出。

讨论后编辑:另一点是,ExpectedException规则与@Test(expected=...)相互之间不能很好地协调,不应该一起使用 - 只有其中一个,否则其中一个(规则)将失败。

答案 1 :(得分:0)

您需要在方法声明中添加throws WarehouseException

public void testRunProblem_withInvalidInput1() throws WarehouseException {

因为这个方法可以抛出已检查的异常,所以你必须在这个方法中捕获它,或者抛出一堆调用,尽管这是唯一的测试方法。

相关问题