在 JdbcTemplate 中模拟重载方法 queryForObject

Posted

技术标签:

【中文标题】在 JdbcTemplate 中模拟重载方法 queryForObject【英文标题】:mocking overloading method queryForObject in JdbcTemplate 【发布时间】:2019-03-27 11:08:22 【问题描述】:

如何使用 mockito 模拟下面的代码?

@Override
@Nullable
public <T> T queryForObject(String sql, Object[] args, int[] argTypes, Class<T> requiredType)
        throws DataAccessException 

    return queryForObject(sql, args, argTypes, getSingleColumnRowMapper(requiredType));

我在下面尝试过:

  @Test
    public void testGetCount()

        Mockito.when(jdbcTemplate.queryForObject(ArgumentMatchers.anyString(),Mockito.refEq(Object[].class),
                Mockito.refEq(Integer[].class), Mockito.eq(Long.class)))
                .thenAnswer((Answer<Long>) invocation -> 2l);
        User user = new User(userDetails);
        Assert.assertEquals(2,dao.getCount(user));
    

请注意,我尝试使用 Mockito.eq 而不是 Mockito.refEq,但结果相同。

但它总是调用下面的方法:

@Override
    public <T> T queryForObject(String sql, Class<T> requiredType, @Nullable Object... args) throws DataAccessException 
        return queryForObject(sql, args, getSingleColumnRowMapper(requiredType));
    

这里是全班:

    public class UserDetailsAggregationDaoTest 

        private final String userDetails = "10015-MTBD";

        @InjectMocks
        private UserDao dao = new UserDaoImpl();

        @Mock
        private JdbcTemplate jdbcTemplate;




   @Test
        public void testGetCount()
            //Using Mockito.refEq
            Mockito.when(jdbcTemplate.queryForObject(ArgumentMatchers.anyString(),Mockito.refEq(Object[].class),
                    Mockito.refEq(Integer[].class), Mockito.eq(Long.class)))
                    .thenAnswer((Answer<Long>) invocation -> 2l);
            User user = new User(userDetails);
            Assert.assertEquals(2,dao.getCount(user));
        


    

任何帮助将不胜感激

【问题讨论】:

见***.com/questions/24123683/… 【参考方案1】:

修改如下:

Mockito.when(jdbcTemplate.queryForObject(ArgumentMatchers.anyString(),Mockito.any(Object[].class),Mockito.any(int[].class), Mockito.eq(Long.class)))
            .thenReturn(2l);

【讨论】:

以上是关于在 JdbcTemplate 中模拟重载方法 queryForObject的主要内容,如果未能解决你的问题,请参考以下文章

阶段3 2.Spring_09.JdbcTemplate的基本使用_4 JdbcTemplate的CRUD操作

如何使用Jmockit模拟JdbcTemplate.update?

SpringJDBC解析4-query方法

Spring利用spring的JdbcTemplate查询返回结果映射到自定义类型

jdbc ,jdbcTemplate,MyBatis,Hibernate比较与分析

课堂,重载 模拟简单计算器