我一直试图使用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("");
}这个问题发生在throw new WarehouseException("")上,它只是抱怨以下几个方面:

关于方法应该处理JUnit Javadocs上的异常这一事实的进一步辩论使我尝试了所要求的内容,其结果如下:


我认为这里的所有错误是,在JUnit访问异常以评估异常之前,Java正在处理异常,从而忽略了我期望在测试期间出现异常的事实。
发布于 2016-03-13 14:43:31
如果ExpectedException是“选中”的异常(换句话说,如果它不是扩展RuntimeException),它并不能免除声明(或捕获)的需要,但在本例中,您希望声明该异常。换句话说,你的方法必须是这样.
public void testRunProblem_withInvalidInput1() throws WarehouseException {
...
}ExpectedException只处理您的测试用例(“如果抛出WarehouseException时不要失败,但是只有当它没有被抛出,等等”),但是方法本身必须是正确的,如果您抛出一个检查过的异常,您必须捕获或声明它,这是Java的要求。在本例中,您希望声明它--因为它将被抛出,然后被ExceptedException捕获(它实际上围绕着您的测试用例方法,这些测试规则就是这样工作的)。
@Test注释的方法可以有任何您想要的throws声明,这是完全可以的。当然,如果不使用ExpectedException TestRule或@Test(expected=...),任何实际抛出的异常都会导致测试方法失败。但是throws只是声明了可以抛出哪些异常,这并不意味着必须抛出它们。
编辑():另一点是,ExpectedException规则和@Test(expected=...)之间不友好,不应该一起使用--只有其中一个,否则其中一个(规则)就会失败。
发布于 2016-03-13 14:44:07
您需要在方法声明中添加throws WarehouseException:
public void testRunProblem_withInvalidInput1() throws WarehouseException {由于此方法可以抛出选中的异常,因此必须在此方法中捕获它,然后抛出到调用堆栈,尽管这是唯一的测试方法。
https://stackoverflow.com/questions/35971607
复制相似问题