Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JMock为一个简单的springjdbcdao编写单元测试_Java_Spring Jdbc_Jmock - Fatal编程技术网

Java 使用JMock为一个简单的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_

我正在为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_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个参数,那就太好了。