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

spring ResultSetExtractor的代码覆盖率问题

东门越
2023-03-14

未覆盖Resultsetextractor匿名类的代码覆盖率。没有删除在运行时,它运行良好。

我们使用下面的示例代码模拟了jdbcTemplate。

mockito.when(maintemplate.QUERY(QUERY,new HashMap(),rs)).thenreturn(new Object());

下面的代码(以@override annotation-extractData()方法开始)在执行后不覆盖。

返回maintemplate.Query(Query,paramMap,new resultsetextractor>(){

        **@Override
        public Map<String, Object> extractData(ResultSet resultSet)
                throws SQLException, DataAccessException {
            Map<String, Object> keyMap = new HashMap<String, Object>();
            while (resultSet.next()) {
                keyMap.put("key1",
                        resultSet.getString("data1"));
                keyMap.put("key2", resultSet.getString("data2"));
            }
            return keyMap;
        }**
    });

请帮帮忙。

Please check sample code for your information.

    **return jdbcTemplatre.query(Query, paramMap, new ResultSetExtractor<byte[]>() {
                @Override
                public byte[] extractData(ResultSet resultSet) throws SQLException,
                        DataAccessException {
                    byte[] data = null;
                    while (resultSet.next()) {
                        signature = resultSet.getBytes("data");
                    }
                    return data;
                }
            });**


    Mockito.when(mainTemplate.query(Query, new HashMap<String,Object>(),rs)).thenAnswer(new Answer<Object>(){
                 @Override
                    public byte[] answer(InvocationOnMock invocationOnMock) throws Throwable {
                        ResultSetExtractor resultSetExtractor = invocationOnMock.getArgumentAt(2,ResultSetExtractor.class);
                        return (byte[]) resultSetExtractor.extractData(resSet);
                    }
            });

共有1个答案

万俟玉书
2023-03-14

未覆盖ResultSetExtractor代码,因为它从未执行过。它不被执行,因为maintemplate.query调用被模拟,因此ResultSetExtractor回调从不被触发。您可以通过使用Mockitos thenAnswer在仍然使用mock时触发它

Mockito.when(mainTemplate.query(QUERY, new HashMap(),rs)).thenAnswer(new Answer<Object>() {
    @Override
    public String answer(InvocationOnMock invocationOnMock) throws Throwable {
        ResultSetExtractor resultSetExtractor = invocationOnMock.getArgumentAt(2, ResultSetExtractor.class);
        resultSetExtractor.extractData(...);
        return new Object();
    }
});

或与Java 8

Mockito.when(mainTemplate.query(QUERY, new HashMap(),rs)).thenAnswer(invocationOnMock -> {
    ResultSetExtractor resultSetExtractor = invocationOnMock.getArgumentAt(2, ResultSetExtractor.class);
    resultSetExtractor.extractData(...);
    return new Object();
});

但是通过这种方式进行测试,您必须自己创建resultset

但一般而言:在模拟中调用ResultSetExtractor.ExtractData的这种方式可能会导致问题,因为它对JDBCTemplate.Query方法如何在内部处理ResultSetExtractor做出了假设。但是这种行为可能会改变,然后您的测试不再代表生产中实际发生的情况。

 类似资料:
  • 这是一个重要的可量化指标,如果代码覆盖率很高,你就可以放心的修改代码,在发版本的时候也能睡个安稳觉。否则就是拆东墙补西墙,陷入无尽的 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应用程序。我不知道如何使用它的代码覆盖功能。我试着谷歌它,但没有找到任何适当的教程。请帮忙。