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));
}
}
我正在尝试模拟 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));
}
}