13

データベースから情報を取得するために使用されるいくつかの DAO オブジェクトがあり、それらの自動テストを作成したいと思っていますが、その方法を理解するのに苦労しています。

Spring を使用して(準備済みステートメントを介して) 実際のクエリを実行し、結果を (クラスJdbcTemplateを介して) モデル オブジェクトにマップしています。RowMapper

単体テストを作成する場合、オブジェクトをどのようにモックするか、またはモックする必要があるかわかりません。たとえば、読み取りしかないため、jdbcTemplate をモックするのではなく、実際のデータベース接続を使用しますが、それが正しいかどうかはわかりません。

バッチの最も単純な DAO の (簡略化された) コードは次のとおりです。

/**
 * Implementation of the {@link BusinessSegmentDAO} interface using JDBC.
 */
public class GPLBusinessSegmentDAO implements BusinessSegmentDAO {
    private JdbcTemplate jdbcTemplate;

    private static class BusinessSegmentRowMapper implements RowMapper<BusinessSegment>  {
        public BusinessSegment mapRow(ResultSet rs, int arg1) throws SQLException { 
            try {
                return new BusinessSegment(rs.getString(...));
            } catch (SQLException e) {
                return null;
            }
        }
    }

    private static class GetBusinessSegmentsPreparedStatementCreator 
        implements PreparedStatementCreator {
        private String region, cc, ll;
        private int regionId;

        private GetBusinessSegmentsPreparedStatementCreator(String cc, String ll) {
            this.cc = cc;
            this.ll = ll;
        }

        public PreparedStatement createPreparedStatement(Connection connection)
                throws SQLException {           
            String sql = "SELECT ...";

            PreparedStatement ps = connection.prepareStatement(sql);
            ps.setString(1, cc);
            ps.setString(2, ll);
            return ps;
        }
    }

    public GPLBusinessSegmentDAO(DataSource dataSource) {
        jdbcTemplate = new JdbcTemplate(dataSource);
    }

    public Collection<BusinessSegment> getBusinessSegments(String cc, String ll) {
        return jdbcTemplate.query(
                new GetBusinessSegmentsPreparedStatementCreator(cc, ll), 
                new BusinessSegmentRowMapper());
    }

}

任意のアイデアをいただければ幸いです。

ありがとう!

4

3 に答える 3

11

以下のリンクをご覧ください。

  1. Spring と DbUnit を使用した SQL クエリのテスト
  2. JdbcTemplate を使用してコードをテストするための MockObjects または DBUnit

それが役立つことを願っています。

編集:

簡単に参照できるように、RowMapperTestsのGitHub バージョンを次に示します。

于 2011-03-23T10:28:46.743 に答える
5

JdbcTemplateクラスへの依存を断ち切り、JdbcOperations代わりにインターフェイスを使用することをお勧めします。

public class GPLBusinessSegmentDAO implements BusinessSegmentDAO {
    private final JdbcOperations jdbc;

    public GPLBusinessSegmentDAO(DataSource dataSource) {
        this(new JdbcTemplate(dataSource));
    }

    public GPLBusinessSegmentDAO(JdbcOperations jdbc) {
        this.jdbc = jdbc;
    }

    // ... DAO methods here
}

単体テストは、2 番目のコンストラクターを呼び出して、モックJdbcOperationsオブジェクトを渡すことができます。すべての DB 操作はjdbcオブジェクトを介して実行されるため、簡単にモックできます。

ライブ コードは、以前と同様に最初のコンストラクターを呼び出すことができます。

于 2011-03-23T10:59:11.067 に答える
2

このための真の単体テストを作成するには、実際のデータベースに触れる必要はありません。ただし、実際のデータソースを基になるデータベースに渡して、getBusinessSegments()メソッドが0、1、および渡したcc値とll値に応じて多くの結果を返すことをテストする方が実用的である場合があります。

調査する価値のある別のオプションは、setUp /@Beforeメソッドのスキーマで初期化された組み込みJavaDBのデータソースを渡すことです。本当にテストしたいのは、SELECT ...クエリがスキーマに正しくマップされることです。そのため、このようなテストでは、実行時にスキーマが変更されたときに発生するエラーをすべてキャッチします。

于 2011-03-23T10:30:32.837 に答える