Spring ResultSetExtractor的代码覆盖问题

时间:2017-03-29 09:08:23

标签: java spring spring-mvc mockito cobertura

不涵盖Resultsetextractor匿名类的代码覆盖率。 在运行时没有例外,运行正常。

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

Mockito.when(mainTemplate.query(QUERY,new HashMap(),rs))。thenReturn(new Object());

执行后,

下面的代码(以@Override注释 - 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 个答案:

答案 0 :(得分:0)

ResultSetExtractor代码未涵盖,因为它永远不会被执行。并且它没有被执行,因为mainTemplate.query调用被模拟,因此永远不会触发ResultSetExtractor回调。 您可以使用Mockitos thenAnswer

在仍然使用模拟时触发它
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。但是这种行为可能会改变,然后你的测试不再代表生产中实际发生的事情。