java - 如何使用参数模拟 jdbcTemplate.query (Object[]{})

标签 java unit-testing mocking mockito jdbctemplate

我正在尝试使用mockito来模拟jdbcTemplate并调用方法查询,并使用Object[]{}向其传递参数。

我正在为我的 DAO 层进行单元测试,我想模拟 jdbcTemplate 并调用方法查询并使用 Object[] {} 传递 sql 字符串、RowMapper 和参数

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 名: -> 在 com.oracle.reporter.tddtest. rhhcomision.OtrasAdicionalesDaoTest.testBuscarOtrasAdicionalesPorFecha(OtrasAdicionalesDaoTest.java:80) -> 在 com.oracle.reporter.tddtest. rhhcomision.OtrasAdicionalesDaoTest.testBuscarOtrasAdicionalesPorFecha(OtrasAdicionalesDaoTest.java:80)

如果匹配器与原始值组合,则可能会发生此异常: //不正确: someMethod(anyObject(), "原始字符串"); 使用匹配器时,所有参数都必须由匹配器提供。 例如: //正确的: someMethod(anyObject(), eq("匹配器的字符串"));

最佳答案

问题是你的 dao 不是一个模拟对象,所以你不应该 此时传递匹配器。

错误:

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

正确:

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

关于java - 如何使用参数模拟 jdbcTemplate.query (Object[]{}),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56781355/

相关文章:

javascript - AngularJS 问题模拟 httpGET 请求

node.js - 为什么我不能用 sinon 正确地 stub twilio 库?

c++ - 谷歌模拟 : "no appropriate default constructor available"?

java - com.google.common.util.concurrent.Service 暂停回调?

javascript - Protractor 等待不必要地失败

java - Spark 构建从 avro 生成 scala

c# - 如何模拟字典?

ruby-on-rails - 无法模拟数据库和 stub :save

java - 使用Java更改Excel日期数据保存到数据库时的日期格式

java - Camel 和缓存生命周期