bra*_*ins 2 java error-handling junit
我一直在尝试使用 JUnit 预期的异常来验证我自己的应用程序异常,但是每当我尝试使用它时,编译器都会抱怨有一个未捕获的异常。
@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("");
}
Run Code Online (Sandbox Code Playgroud)
问题发生在throw new WarehouseException("")它只是抱怨以下内容的地方:
关于该方法应该通过 JUnit Javadocs 处理异常这一事实的进一步辩论使我尝试了所问的问题,结果如下:
我能想到的所有错误是 Java 在 JUnit 可以访问它以评估它之前处理异常,从而忽略了我期望在测试期间出现异常的事实。
ExpectedException如果 Exception 是“已检查的”异常(换句话说,如果它没有扩展RuntimeException),则不会使您无需声明(或捕获,但在这种情况下,您要声明)该 Exception 。换句话说,你的方法必须是这样的......
public void testRunProblem_withInvalidInput1() throws WarehouseException {
...
}
Run Code Online (Sandbox Code Playgroud)
ExpectedException只处理你的测试用例(“不要失败,如果抛出 WarehouseException,但只有当它没有被抛出等”)等,但方法本身必须是正确的 Java,如果你抛出一个检查的 Exception,你必须捕获或声明它,这是 Java 的要求。在这种情况下,您想要声明它 - 因为它将被抛出然后被 the ExceptedException(它有效地包裹在您的测试用例方法周围,这就是这些测试规则的工作方式)。
@Test带注释的方法可以有任何throws你想要的声明,这完全没问题。当然,如果不使用ExpectedException TestRuleor @Test(expected=...),任何实际抛出的异常都会导致测试方法失败并出现错误。但throws只是声明可以抛出哪些异常,并不意味着它们必须被抛出。
讨论后编辑: 另一点是,ExpectedException规则和@Test(expected=...)彼此之间不能很好地配合使用,不应一起使用 - 只能使用其中之一,否则其中之一(规则)将失败。
| 归档时间: |
|
| 查看次数: |
5520 次 |
| 最近记录: |