1

春のjdbc daoの単体テストを書いています。テストする方法は次のとおりです。

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 の行マッパーと異なることです。だから期待は裏切らない。

withSQLクエリとrow​​mapperを配置しようとしwith(any(RowMapper.class))ました。「すべてのパラメーターに明示的なマッチャーが指定されているわけではありません。すべてのパラメーターをマッチャーで指定するか、すべてを値で指定する必要があります。マッチャーと値を混在させることはできません」

4

3 に答える 3

2

ここでいくつかの点が欠けている可能性があると思います。最初の試行では、ターゲット コードの動作をモックで再現しました。あなたは本当に何をテストしようとしていますか?

この種のテストでは、実際のデータベースにヒットする焦点を絞ったテストを作成することを好みます。私は何年も前に JDBC を嘲笑しようとしましたが、後悔しました。この種のコードで通常失敗するのは、Java コード自体ではなく、データベースとの関係です。

これは実際にはクエリです (オブジェクトの外側の世界の状態を変更しません)。そのため、.allowing()ではなく句を使用する傾向がありoneOf()ます。基になるメカニズムは同じですが、意図をより適切に表現します。

context.assertIsSatisfied()最後に、直接呼び出すのではなく、使用することを検討してください

@RunWith(JMock.class)

テストの一番上。

于 2012-04-13T09:53:04.380 に答える
1

最後に追加して問題を解決しwith(any(Object.class))ました。

oneOf(jdbcTemplate).queryForObject(with(equal("sql_query")), with(any(RowMapper.class)), with(any(Object.class)));

queryForObjectメソッドが非常にオーバーロードされるため、jmockは呼び出す適切なメソッドを見つけるのに問題があったと思います。

于 2012-04-12T17:53:59.640 に答える