java junit异常哈希代码覆盖

时间:2019-04-20 20:29:24

标签: java junit jacoco

我是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);
    }
}

感谢您的帮助。

3 个答案:

答案 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的支持。