我是java,junit和jacoco的新手。我正在如下进行异常处理。我也正在捕获Exception类,以防该方法抛出任何其他先前未捕获的异常。
private void myMethod1() throws MyCustomException {
....
try {
..... straight JDBC calls for select, insert, update operations ....
} catch (SQLException sqEx) {
logger.error(....);
new MyCustomException(.....);
} catch (RuntimeException rEx) {
logger.error(....);
new MyCustomException(.....);
} catch (Exception ex) {
logger.error(....);
new MyCustomException(.....);
}
}
在Junit测试中,尝试如下。当我具有运行时时,除非抛出异常,否则我抛出的任何异常始终将进入RuntimeException catch块本身。我可以尝试检查哪个其他异常,使其进入“异常捕获”块。因此,我无法获得所需的代码覆盖率。
private void testMyMethod1() {
....
try {
.....
when(...).thenThrow(new SocketException());
spy.myMethod1();
} catch (SQLException sqEx) {
assertTrue(false);
} catch (RuntimeException rEx) {
assertTrue(false)
} catch (Exception ex) {
assertTrue(true);
}
}
感谢您的帮助。
答案 0 :(得分:1)
在thenThrow中,您引发了套接字异常,但是您试图捕获其他异常,例如SQLException。如果抛出的异常不是SQLException的子级,则它将不会进入该块。
还请确保通过调试在when().. thenThrow()语句中创建适当的异常。有时创建不适当的异常会导致问题。
答案 1 :(得分:1)
几件事...如果您的myMethod1()
不在同一个Java类中,则无法在单独的单元测试类中测试私有方法。最好保护您的myMethod1()
软件包。在测试类中,最好不要在其中包含任何try catch或if语句。您必须针对每个测试用例制定单独的测试方法,而不是一并制定。您可以利用@Rule
或@expected
注释。我建议做这样的事情...
@Test(expected = MyCustomException.class)
public void testMyMethod1_handlesSQLException(){
doThrow(SQLException.class).when(...);
Foo foo = new Foo();
foo.myMethod1();
}
@Test(expected = MyCustomException.class)
public void testMyMethod1_handlesRuntimeException(){
doThrow(RuntimeException.class).when(...);
Foo foo = new Foo();
foo.myMethod1();
}
@Test(expected = MyCustomException.class)
public void testMyMethod1_handlesException(){
doThrow(Exception.class).when(...);
Foo foo = new Foo();
foo.myMethod1();
}
答案 2 :(得分:1)
在JUnit 5中,可能的方法是:
@ParameterizedTest
@ValueSource(classes = {
SQLException.class,
RunTimeException.class,
Exception.class
})
void methodWrapsException(Exception toBeWrapped) {
Foo foo = new Foo(...);
doThrow(toBeWrapped).when(...);
assertThrows(MyCustomException.class, () -> foo.myMethod1());
}
这利用了JUnit 5对parameterized classes的支持及其对异常的lambda-based assertions的支持。