Java 使用JMock为一个简单的springjdbcdao编写单元测试
我正在为SpringJDBCDAO编写一个单元测试。测试方法为:Java 使用JMock为一个简单的springjdbcdao编写单元测试,java,spring-jdbc,jmock,Java,Spring Jdbc,Jmock,我正在为SpringJDBCDAO编写一个单元测试。测试方法为: public long getALong() { return simpleJdbcTemplate.queryForObject("sql query here", new RowMapper<Long>() { public Long mapRow(ResultSet resultSet, int i) throws SQLException { return resultSet.getLong("a_
public long getALong() {
return simpleJdbcTemplate.queryForObject("sql query here", new RowMapper<Long>() {
public Long mapRow(ResultSet resultSet, int i) throws SQLException {
return resultSet.getLong("a_long");
}
});
}
以下是我在测试中得到的信息:
public void testGetALong() throws Exception {
final Long result = 1000L;
context.checking(new Expectations() {{
oneOf(simpleJdbcTemplate).queryForObject("sql_query", new RowMapper<Long>() {
public Long mapRow(ResultSet resultSet, int i) throws SQLException {
return resultSet.getLong("a_long");
}
});
will(returnValue(result));
}});
Long seq = dao.getALong();
context.assertIsSatisfied();
assertEquals(seq, result);
}
很自然,测试不起作用,否则,我不会在这里问这个问题。问题是测试中的行映射器与DAO中的行映射器不同。因此,预期没有实现
我试图在sql查询中使用withanyRowMapper.class,并在rowmapper中使用withanyRowMapper.class。它也不起作用,抱怨并不是所有参数都有显式匹配器:要么所有参数都必须由匹配器指定,要么所有参数都必须由值指定,您不能混合匹配器和值,也不能为查询字符串提供匹配器,例如
oneOf(simpleJdbcTemplate).queryForObject(
with( equal("sql_query") ),
with( any(RowMapper.class) )
);
也为查询字符串提供匹配器,例如
oneOf(simpleJdbcTemplate).queryForObject(
with( equal("sql_query") ),
with( any(RowMapper.class) )
);
我通过在末尾添加anyobject.class解决了这个问题
oneOf(jdbcTemplate).queryForObject(with(equal("sql_query")), with(any(RowMapper.class)), with(any(Object.class)));
我认为jmock在找到正确的方法调用时遇到了困难,因为queryForObject方法重载太多。我通过在末尾添加withanyObject.class解决了这个问题
oneOf(jdbcTemplate).queryForObject(with(equal("sql_query")), with(any(RowMapper.class)), with(any(Object.class)));
我认为jmock在找到正确的方法调用时遇到了困难,因为queryForObject方法重载太多。我认为您可能遗漏了几点。您的第一次尝试复制了模拟中目标代码的行为。你到底想测试什么 对于这种测试,我更喜欢编写一个针对真实数据库的集中测试。许多年前,我曾试图嘲弄JDBC,但后来后悔了。这种代码中通常失败的是与数据库的关系,而不是java代码本身 这实际上是一个查询,它不会改变对象外部世界的状态,因此我倾向于使用allowing子句而不是of子句。这是相同的潜在机制,但更好地表达了意图 <>最后,不要直接调用CONTEX.AsjDISTITY,而是考虑使用< /P>
@RunWith(JMock.class)
在测试的顶部。我认为您可能遗漏了几点。您的第一次尝试复制了模拟中目标代码的行为。你到底想测试什么 对于这种测试,我更喜欢编写一个针对真实数据库的集中测试。许多年前,我曾试图嘲弄JDBC,但后来后悔了。这种代码中通常失败的是与数据库的关系,而不是java代码本身 这实际上是一个查询,它不会改变对象外部世界的状态,因此我倾向于使用allowing子句而不是of子句。这是相同的潜在机制,但更好地表达了意图 <>最后,不要直接调用CONTEX.AsjDISTITY,而是考虑使用< /P>
@RunWith(JMock.class)
在测试的顶部。看看Poutsma自己从Github获得的RowMapper测试使用情况:看看Poutsma自己从Github获得的RowMapper测试使用情况:不,它也不起作用。我发现并非所有参数都有显式匹配器:要么所有参数都必须由匹配器指定,要么所有参数都必须由值指定,不能将匹配器和值混合使用。错误。@Quincy,sql\u query后缺少。不,它也不起作用。我发现并不是所有参数都有显式匹配器:要么所有参数都必须由匹配器指定,要么所有参数都必须由值指定,您不能混合匹配器和值。错误。@Quincy,sql_查询后缺少。请您告诉我们,您正在测试的方法需要3个参数,如果您能告诉我们您正在测试的方法使用了3个参数,而不是2个参数,那就太好了。