当前位置: 首页 > 知识库问答 >
问题:

代码覆盖率的java jUnit异常处理

丘友樵
2023-03-14

我不熟悉java、Junit和jacoco。我正在做下面的异常处理。我也在捕获异常类,以防该方法抛出之前未捕获的任何其他异常。

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测试中,尝试如下。当我有运行时的任何异常时,我抛出的总是运行时异常捕获块本身,除非我抛出异常。我可以尝试其他哪个选中的异常,使其进入异常捕获块。因此,我无法获得所需的代码覆盖率。

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个答案

陶高峯
2023-03-14

在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对参数化类的支持及其基于lambda的异常断言。

楚建柏
2023-03-14

有几件事。。。如果您的myMethod1()不在同一个java类中,则无法在单独的单元测试类中测试私有方法。最好是保护您的myMethod1()包。在测试类中,最好不要包含任何try-catch或if语句。您必须为每个测试用例制定单独的测试方法,而不是一个测试用例。您可以利用@规则@预期的注释。我建议你这样做。。。

@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();
}
齐起运
2023-03-14

在thenThrow中,您抛出了套接字异常,但您正在尝试捕获其他异常,如SQLException。如果抛出的异常不是SQLException的子级,则它不会进入该块。

另外,请确保您正在通过调试在当()... thenThrow()语句中创建正确的异常。有时创建不适当的异常会导致问题。

 类似资料:
  • 这是一个重要的可量化指标,如果代码覆盖率很高,你就可以放心的修改代码,在发版本的时候也能睡个安稳觉。否则就是拆东墙补西墙,陷入无尽的 bug 诅咒中。 那么在 OpenResty 里面如何看到代码覆盖率呢?其实很简单,使用 LuaCov 可以很方便的实现。 我们先了解下 LuaCov,这是一个针对 Lua 脚本的代码覆盖率工具,通过 luarocks 来安装: luarocks install l

  • 问题内容: 我正在使用Mocha测试我的NodeJS应用程序。我无法弄清楚如何使用其代码覆盖功能。我尝试使用Google搜索,但没有找到任何合适的教程。请帮忙。 问题答案: 您需要一个额外的库来覆盖代码,而伊斯坦布尔的强大和便捷将使您震惊。通过Mocha测试后,请尝试以下操作: 现在,只需将命令nyc放在现有测试命令的前面,例如:

  • 我的代码运行在具有单独JVM的单独虚拟机上。我想在此虚拟机上以tcpserver模式设置JaCoCo代理以收集覆盖率数据。然后,我将在我的maven项目中以tcpclient模式设置JaCoCo代理,以连接到上面提到的VM并获取覆盖率数据。 问题是代理不收集任何覆盖数据。在中创建了覆盖率数据文件,但该文件为空。 下面是代理选项:-Java agent:/usr/xx/plugins/org . j

  • 我在声纳中的代码覆盖率显示为0%,这不是真的,因为我有单元测试。 格拉德尔 当我打开inside然后我可以看到成功的单元测试。 我在Jenkins环境中运行作为

  • 我正在为我的grails 3.1.6项目添加cobertura代码覆盖率,覆盖率报告似乎有点少,即我有单元测试用例(pos和neg两种情况)来覆盖if块,但报告说没有覆盖if块。gradle:2.13 Groovy:2.4.5 Grails:3.1.6 cobertura gradle Plugin:net.saliman:gradle-cobertura-plugin:2.3.2 这是我的代码

  • 我正在使用Mocha测试我的NodeJS应用程序。我不知道如何使用它的代码覆盖功能。我试着谷歌它,但没有找到任何适当的教程。请帮忙。