增加JdbcTemplate模拟的代码覆盖率

Nav*_*r K 3 spring unit-testing code-coverage mockito jacoco

我在模拟JdbcTemplate用于单元测试用例,因为不想达到实际的数据库集成。

但这正在减少我的代码覆盖率(红色表示缺少覆盖率)。

在此处输入图片说明

以下是使用的代码段。使用用户定义的映射器也会发生相同的情况。

final List<String> resultList = new ArrayList<String>();
resultList.add("test1");
resultList.add("test2");
final JdbcTemplate template = Mockito.mock(JdbcTemplate.class);
Mockito.when(
    template.query(Mockito.anyString(), Mockito.any(Object[].class),
        Mockito.any(RowMapper.class))).thenReturn(resultList);
sampleDao.setJdbcTemplate(template);
Run Code Online (Sandbox Code Playgroud)

有关increasing codedao类的任何想法。在我的情况下,所有方法都不适合用户定义的行映射器。

Inv*_*row 6

一种方法如下:

final List<String> resultList = new ArrayList<String>();
resultList.add("test1");
resultList.add("test2");

final JdbcTemplate template = mock(JdbcTemplate.class);

when(template.query(anyString(), any(Object[].class), any(RowMapper.class)))
    .thenAnswer(new Answer<List<String>>() {
        @Override
        public Object answer(InvocationOnMock invocation) throws Throwable {
            // Fetch the method arguments
            Object[] args = invocation.getArguments();

            // Fetch the row mapper instance from the arguments
            RowMapper<String> rm = (RowMapper<String>) args[2]; 

            // Create a mock result set and setup an expectation on it
            ResultSet rs = mock(ResultSet.class);
            String expected = "value returned by query";
            when(rs.getString(1)).thenReturn(expected);

            // Invoke the row mapper
            String actual = rm.mapRow(rs, 0);

            // Assert the result of the row mapper execution
            assertEquals(expected, actual);

            // Return your created list for the template#query call
            return resultList;
        }
    });
Run Code Online (Sandbox Code Playgroud)

但是正如您所看到的,测试行映射器的代码很多:)

就个人而言,我更喜欢进行集成测试,或者将行映射器移至其自己的类,并分别对其进行单元测试。