3

Spring プロジェクトでクラスをテストしようとしています。テストクラスとdaoクラスでできるだけ多くの変更を加えて、変更のためにあらゆる種類のものを再テストする必要がないようにしたいと思います。

私が扱っているクラスにJdbcTemplate templateは、次によってインスタンス化されるクラス変数があります。

setJdbcTemplate(DataSource dataSource) {
    this.template = new JdbcTemplate(dataSource);
}

テストしたいメソッドはtemplate.query(<code>)、定義済みの SQL クエリを実行し、結果をリストに返すようにします。

テストケースで以下を作成しましたが、それを使用する方法がわかりません。Mockito を使用して、次のコードで特定の文字列のリストを返すようにすることはできますか?

DataSource mockedDataSrc = Mockito.mock(DataSource.class);
customerClassDao.setJdbcTemplate(mockedDataSrc); 

または別のコマンドを使用しwhenて、JdbcTemplate の.query呼び出しに返されるものを設定できますか?

4

2 に答える 2

4

DAO をテストしている場合、データ ソースをモックしてもまったく意味がありません。何をテストしていますか?データベースと対話する DAO を作成する必要があります。

それが機能したら、それを使用するサービスをテストするときに、インターフェースベースの DAO を自由にモックできます。DAO は既にテスト済みです。サービスをテストするときにやり直す必要はありません。

DAO をテストするときにデータ ソースをモックしている場合は、軌道から外れていると言えます。

于 2013-03-27T20:41:41.070 に答える
2

JdbcTemplate実装を制御できないため、これを行うことはできません。依存性を注入してから、代わりに JdbcTemplateモックする必要があります。JdbcTemplate

この問題は、コードの問題を指摘しています。コードは の具体的なインスタンスに依存しますJdbcTemplate。代わりに依存性注入を使用すると、結合が少なくなります。


テスト中のシステムを変更したくないので、これを行うことができます:

templateパッケージが保護されるようにフィールドを変更します (つまり、private キーワードを削除します)。次に、テストしているクラスをインスタンス化した後、それをモック (JdbcTemplate.class) に設定します。これで、当初望んでいたように、JdbcTemplate で when と verify を直接使用できるようになります。

したがって、テストするクラスは次のようになります。

public class SystemUnderTest {

JdbcTemplate jdbcTemplate;

    public void setJdbcTemplate(DataSource dataSource) {
        this.template = new JdbcTemplate(dataSource);
    }

}

そして、あなたのテストはこれを行います:

@Before
public void setUp() {
    SystemUnderTest sut = new SystemUnderTest();
    sut.jdbcTemplate = mock(JdbcTemplate.class);                
}

// ...
于 2013-03-27T20:01:06.367 に答える