【发布时间】:2020-10-31 12:42:57
【问题描述】:
我为 getEmployeeDetails 方法编写了一个测试类,其中包含一个过程,该过程将在游标中返回员工详细信息,实现了一个自定义行映射器来映射这些字段。
我能够在方法中模拟 StoredProcedure 调用并执行该方法,但是当我查看代码覆盖率时,自定义行映射器不包含在代码覆盖率中
下面是我的存储库类
public class EmployeeRepository {
@Autowired
private JdbcRepository jdbcRepository
public List<Employee> getEmployeeDetails() {
SqlParameter[] sqlParameters = new SqlParameter[] {
new SqlOutParameter("employeedetails", OracleTypes.CURSOR, new EmployeeListHandler()) };
Map<String, Object> result = jdbcRepository.executeProcedure("employee_list_proc", sqlParameters, new HashMap<>());
return (List<Employee>) result.get("employeedetails");
}
private class EmployeeListHandler implements RowMapper<Employee> {
@Override
public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
Employee employee = new Employee();
employee.setId(rs.getLong("id");
employee.setName(rs.getString("name"));
// Rest of the employee Attributes
return employee;
}
}
}
下面是我的自定义 JbdcRepository 类
public Class JdbcRepository {
public Map<String, Object> executeProcedure(String procedureName, SqlParameter[] sqlParameters,
Map<String, Object> inputParams){
StoredProcedure procedure = new GenericStoredProcedure();
setDataSource(procedure);
procedure.setSql(procedureName);
procedure.setFunction(false);
procedure.setParameters(sqlParameters);
return procedure.execute(inputParams);
}
}
下面是我的测试课
@Mock
private JdbcRepository jdbcRepository;
@Mock
private ResultSet rs;
@InjectMocks
private EmployeeRepository employeeRepository;
@Test
public void testEmployeeDetails() throws Exception{
when(rs.next()).thenReturn(true).thenReturn(false);
when(rs.getString(anyString())).thenReturn("TEST");
when(jdbcRepository.executeProcedure(anyString(), any(SqlParameter[].class),
anyMap())).thenReturn(new HashMap<>());
employeeRepository.getEmployeeDetails();
verify(jdbcRepository, times(1)).executeProcedure(anyString(), any(SqlParameter[].class),
anyMap());
verifyNoMoreInteractions(jdbcRepository);
}
我已经模拟了结果集,但是 EmployeeListHandler 仍然没有包含代码覆盖率,不确定我在哪里做错了..
编辑 1:如果我做错了,有什么替代方法来获得完整的代码覆盖率。
【问题讨论】:
标签: java spring spring-boot junit mockito