JdbcTemplate Mockito ClassCastException 异常

JdbcTemplate Mockito ClassCastException

我正在尝试模拟 Spring 框架的 JdbcTemplate class 的方法。该方法具有以下签名:

public <T> T queryForObject(String sql, Class<T> requiredType) throws DataAccessException {...}

正在如下所述进行模拟:

when(jdbcTemplate.queryForObject(anyString(), eq(String.class))).thenReturn("data");

然而,这个调用抛出以下异常

java.lang.ClassCastException: org.mockito.internal.creation.jmock.ClassImposterizer$ClassWithSuperclassToWorkAroundCglibBug$$EnhancerByMockitoWithCGLIB$$ce187d66 cannot be cast to java.lang.String
at test.DaoJdbcTest.setUp(DaoJdbcTest.java:81)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
...

知道我做错了什么吗?

提前致谢~

编辑:

完整代码如下:

public class DaoJdbc extends NamedParameterJdbcSupport {
    public String query(String sql) {
        return getJdbcTemplate().queryForObject(sql, String.class);
    }
}

public class DaoJdbcTest {
    @Mock(answer = Answers.RETURNS_SMART_NULLS)
    private JdbcTemplate jdbcTemplate;

    private DaoJdbc dao;

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);

        dao = new DaoJdbc();
        dao.setJdbcTemplate(jdbcTemplate);

        Mockito.when(jdbcTemplate.queryForObject(anyString(), Matchers.eq(String.class))).thenReturn("data");
    }

    @Test
    public void testQuery() {
        String ret = dao.query("select 'test' from dual");

        assertEquals("data", ret);

        verify(jdbcTemplate).queryForObject(anyString(), eq(String.class));
    }
}

删除答案 = Answers.RETURNS_SMART_NULLS。当我删除它时测试通过。该功能有什么作用?默认的 null 行为对我来说很好。

作为奖励,您还可以使用 MockitoJunitRunner 稍微清理一下代码...

@RunWith(MockitoJUnitRunner.class)
public class DaoJdbcTest {
    @Mock
    private JdbcTemplate jdbcTemplate;

    @InjectMocks
    private DaoJdbc dao;

    @Before
    public void setUp() throws Exception {
        Mockito.when(jdbcTemplate.queryForObject(anyString(), Matchers.eq(String.class))).thenReturn("data");
    }

    @Test
    public void testQuery() {
        String ret = dao.query("select 'test' from dual");

        assertEquals("data", ret);

        verify(jdbcTemplate).queryForObject(anyString(), eq(String.class));
    }
}