Как смоделировать jdbcTemplate.query с параметрами (Object [] {}) - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь использовать mockito для макета jdbcTemplate и вызова запроса метода, передавая его параметры, используя Object [] {}.

Я делаю модульный тест для моего уровня DAO. Я хочу смоделировать jdbcTemplate, вызвать метод, передать строку sql, RowMapper и параметры, используя Object [] {}

public List<EntityType> myDaoMethod(Date fechaInicio, Date fechaFin)
            throws NotDataFoundException {
        log.info("entering => myDaoMethod");
        log.info("param => fechaInicio :" +  fechaInicio);
        log.info("param => fechaFin :" +  fechaFin);

        log.debug("Se ejecutando consulta...");
        try {

            List<EntityType> query = jdbcTemplate.query(QueryStrs.MY_QUERY,
                    new Object[] {fechaInicio, fechaFin},
                    new BeanPropertyRowMapper<EntityType>(EntityType.class));
            log.debug("Se ejecuto consulta. ");

            return query;
        }catch(DataAccessException e) {
            log.error("No se encontro informacion en la consulta myDaoMethod (2)", e);
            throw new NotDataFoundException(e);
        }finally {
            log.info("exiting => myDaoMethod");
        }
    }
    @Mock
    private JdbcTemplate jdbcTemplate;

        @Test
    public void myTestMethod() throws NotDataFoundException {

        List<EntityType> listValue = new ArrayList<>();

        listValue.add(new EntityType((short) 2, "modem 2"));
        listValue.add(new EntityType((short) 1, "modem"));

        when(jdbcTemplate.query(any(String.class),any(Object[].class), any(BeanPropertyRowMapper.class))).thenReturn(listValue);

        MyDao dao = new MyDaoImpl(jdbcTemplate);
        List<EntityType> otrasAdicionalesPorRangoFecha = dao.myDaoMethod(any(Date.class), any(Date.class));

        Assert.assertNotNull(otrasAdicionalesPorRangoFecha);
        Assert.assertTrue(!otrasAdicionalesPorRangoFecha.isEmpty());
//      Assert.assertArrayEquals(listValue.toArray(), otrasAdicionalesPorRangoFecha.toArray());

    }

Результат трассировки

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Неправильное использование сопоставителей аргументов! Ожидается 3 матча, 2 записано: -> at com.oracle.reporter.tddtest.rrhhcomision.OtrasAdicionalesDaoTest.testBuscarOtrasAdicionalesPorFecha (OtrasAdicionalesDaoTest.java:80) -> at com.oracle.reporter.tddtest.rrhhcomision.OtrasAdicionalesDaoTest.testBuscarOtrasAdicionalesPorFecha (OtrasAdicionalesDaoTest.java:80)

Это исключение может возникнуть, если сопоставления объединяются с необработанными значениями: // неправильно: someMethod (anyObject (), "raw String"); При использовании совпадений все аргументы должны быть предоставлены сопоставителями. Например: //правильный: someMethod (anyObject (), eq ("String by matcher"));

1 Ответ

1 голос
/ 27 июня 2019

Проблема в том, что ваш dao не является осмеянным объектом, поэтому вы не должны чтобы пройти матчеров в этой точке.

Неправильно:

dao.myDaoMethod(any(Date.class), any(Date.class));

Правильно:

dao.myDaoMethod(new Date(1), new Date(2));
...