我正在尝试模拟Spring框架的JdbcTemplate
类的方法。该方法具有以下特征:
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));
}
}
答案 0 :(得分:0)
删除答案= 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));
}
}