0

私の最新のプロジェクトでは TDD アプローチを使用しています。私にとっては新しいです:)

CSV レコードをデータベースに保存するサービスがあります。値の存在を確認し、必要に応じて追加します。したがって、複数のDAOがあります。

以下は問題なく動作するテストですが、これを書くためのより良い方法があれば教えてもらえますか? 気分が悪い。

ありがとう

@Test
public void loadTest() {
    //mock....all methods called in my save method
    Dao1 dao1 = mock(Dao1.class);
    when(dao1.findByDescription(anyString())).thenReturn(mock(Model1.class));
    Dao2 dao2 = mock(Dao2.class);
    when(dao2.findByDescription(anyString())).thenReturn(mock(Model2.class));
    Dao3 dao3 = mock(Dao3.class);
    when(dao3.findByDescription(anyString())).thenReturn(mock(Model3.class));
    Dao4 dao4 = mock(Dao4.class);

    RowFromCsv row = mock(RowFromCsv.class);
    when(row.getAttribute1()).thenReturn(new DateTime()); //otherwise test fails - nullpointerexception
    when(row.getAttribute2()).thenReturn(new DateTime());
    Csv csv = mock(Csv.class);
    when(csv.next()).thenReturn(row).thenReturn(null);

    //this is what im testing...
    Service load = new Service();
    load.setDao1(dao1);
    load.setDao2(dao2);
    load.setDao3(dao3);
    load.setDao4(dao4);
    load.save(csv);

    //save called ok...
    verify(dao4).createOrUpdate(any(Model4.class));
}
4

1 に答える 1

1

テストは問題ないようです。フィクスチャをセットアップし、メソッドを実行してから、期待どおりに動作したことを確認します。

モック ファクトリとして機能するユーティリティ クラスを作成すると、読みやすくなります。findByDescription(string)メソッドが class または interface で定義されていると仮定するとBaseDao、次のようなことができます。

public class MockFactory {
    public static <D extends BaseDao,M> D mockDao(Class<D> daoClass, Class<M> modelClass) {
        D dao = mock(daoClass);
        M model = mock(modelClass);
        when(dao.findByDescription(anyString())).thenReturn(model));
        return dao;
    }

    public static Csv csvWithOneRecord() {
        RowFromCsv row = mock(RowFromCsv.class);
        when(row.getAttribute1()).thenReturn(new DateTime()); 
        when(row.getAttribute2()).thenReturn(new DateTime());
        Csv csv = mock(Csv.class);
        when(csv.next()).thenReturn(row).thenReturn(null);
    }
} 

このアプローチにより、テストが読みやすくなり、モックが再利用可能になります。ファクトリ メソッドには、返されるモックの種類を説明する名前が付いていることを確認してください。サック ファクトリ メソッドが多数必要な場合は、複数のユーティリティ クラスを作成し、各ユーティリティ クラスを 1 つのタイプのモック専用にする必要があります。すなわちDaoMockFactoryCsvMockFactoryなど。

もう 1 つ: いくつかの命名規則に従うことをお勧めします。

  • 各メイン クラス、つまりclass TestServiceに対して1 つのテスト クラスを用意しclass Serviceます。
  • テストしているメソッド、つまり method testSave()tests methodにちなんで名付けられたユニットテストメソッドを持っていsave()ます。
于 2013-05-17T01:17:44.163 に答える