Невозможно смоделировать класс BeanPropertyRowMapper в тестовом классе

#java #unit-testing #testing #mockito

#java #модульное тестирование #тестирование #mockito

Вопрос:

Невозможно смоделировать данные BeanPropertyRowMapper в тестовом классе. Пробовал с разными сценариями. Может кто-нибудь, пожалуйста, помочь мне в этом.

Он возвращает нулевой объект dtoResposne , но возвращает данные в объекте dto. Здесь утверждение завершается ошибкой, пока мы сравниваем с dto с помощью dtoResponse.

Приведенный ниже код связан с классом DaoImpl

 public Dto getViewData(String requestId, List<String> errorLsist) {
    String sql = "SELECT * FROM table WHERE id = ?";
        return (Dto) getJdbcTemplate().queryForObject(sql, new Object[] { requestId },
                new BeanPropertyRowMapper(Dto.class));
}

Below code is related to test class 

        String sql = "SELECT * FROM dom.deployment WHERE request_id = ?";
        List<Dto> data = new ArrayList<>();
        Dto dto = new Dto();
        dto.setDecisionFlowGuid(guid);
        data.add(dto);
    Mockito.when(jdbcTemplate.query(
                "SELECT * FROM dom.deployment WHERE request_id = "   requestId,
                new BeanPropertyRowMapper<>(Dto.class))).thenReturn(data);
        Dto dtoResponse = deploymentDaoUtilImpl.getViewData(requestId, errors);
        assertEquals(dto, dtoResponse);

Tried with below scenarios as well.

    Mockito.when((Dto) jdbcTemplate.queryForObject(sql, new Object[] { requestId },
                new BeanPropertyRowMapper<Dto>(Dto.class))).thenReturn(dto);

        Mockito.when((Dto) jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Dto.class)))
                .thenReturn(dto);
 

Ответ №1:

«JdbcTemplate» должен быть сначала создан как макет (т.Е. Mockito.mock), а затем макет вводится как зависимость вызывающему.

Затем ваш макет.когда ниже необходимо обернуть объект, который вы пытаетесь смоделировать, и функция появляется после. Просмотрите синтаксис в примерах / docs online.

    Mockito.when(jdbcTemplate.query(
                "SELECT * FROM dom.deployment WHERE request_id = "   requestId,
                new BeanPropertyRowMapper<>(Dto.class))).
 

Комментарии:

1. Спасибо за ответ… Я уже издевался над JdbcTemplet, но все равно получаю данные ответа как null. Dto dtoResponse = deploymentDaoUtilImpl.getViewData(RequestID, ошибки); для приведенного выше я получаю данные ответа как null. @Mock JdbcTemplate JdbcTemplate; как и выше, я издевался над JdbcTemplet

Ответ №2:

Проблема решена с помощью приведенного ниже кода

 BeanPropertyRowMapper mapper = new BeanPropertyRowMapper((Dto.class));
    Mockito.when(jdbcTemplate.queryForObject(eq(sql), eq(new Object[] { requestId }), any(BeanPropertyRowMapper.class))).thenReturn(dto);

    Dto dtoResponse = deploymentDaoUtilImpl.getViewData(requestId, errors);
    
    assertEquals(dto, dtoResponse);