我一直在尝试使用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("")
上,只是抱怨以下内容:
关于该方法应该处理JUnit Javadocs异常这一事实的进一步辩论促使我尝试了所提出的问题,结果如下:
我认为这是错误的是Java正在处理异常,因为JUnit可以访问它以评估它,从而忽略了我期望在测试期间发生异常的事实。
答案 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 {
因为这个方法可以抛出已检查的异常,所以你必须在这个方法中捕获它,或者抛出一堆调用,尽管这是唯一的测试方法。