在JdbcTemplate中模拟重载方法queryForObject

问题描述 投票:0回答:1

如何使用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));
        }


    }

任何帮助,将不胜感激

mockito jdbctemplate
1个回答
0
投票

通过更改如下修复它:

Mockito.when(jdbcTemplate.queryForObject(ArgumentMatchers.anyString(),Mockito.any(Object[].class),Mockito.any(int[].class), Mockito.eq(Long.class)))
            .thenReturn(2l);
© www.soinside.com 2019 - 2024. All rights reserved.