19

これが私の質問です:

すべてが汎用サービスからメソッドを継承することをテストするためのいくつかのWebサービスクラスがあります。それぞれの単体テストを作成するのではなく、機能領域ごとにテストスイートを分類できると思います(つまり、それぞれが異なる基になるDAOメソッド呼び出しに依存する3つのグループのテストメソッド)。

私が提案することは次のとおりです。

@Mock StateDAO mockedStateDao;
@Mock CountyDAO mockedCountyDao;
@Mock VisitorDAO mockedVisitorDao;

次に、電話します。

@InjectMocks CountyServiceImpl<County> countyService = new CountyServiceImpl<County>();
@InjectMocks StateServiceImpl<State> stateService = new StateServiceImpl<State>();
@InjectMocks VisitorServiceImpl<Visitor> visitorService = new VisitorServiceImpl<Visitor>();

各mockedDAOが正しいサービスに注入されることをどのように確認できますか?(@InjectMocksを使用するよりも)3つすべてを自動配線する方が簡単でしょうか?

Spring、Hibernate、Mockitoを使用しています...

4

4 に答える 4

22

ニコラスの答えはほぼ正しいですが、推測する代わりに、InjectMocksの javadoc を見てください。詳細が含まれています;)

1 つのテストで非常に多くの Service を使用するのは奇妙で、単体テストとしても統合テストとしても適切ではありません。単体テストでは、共同作業者が多すぎるため、オブジェクト指向 (または SOLID) のように見えないため、間違っています。統合テストでは、DB との統合をテストするコードがそれをモックしていないため、奇妙です。

1.9.5 での迅速な参照のために、次のものがあります。

注射を行うフィールドをマークします。

省略形のモックとスパイ インジェクションを許可します。反復的なモックおよびスパイ インジェクションを最小限に抑えます。Mockito は、コンストラクター インジェクション、セッター インジェクション、またはプロパティ インジェクションのいずれかの順序で、以下で説明するように、モックのみをインジェクトしようとします。次の戦略のいずれかが失敗した場合、Mockito は失敗を報告しません。つまり、依存関係を自分で提供する必要があります。

  1. コンストラクター注入; 最大のコンストラクターが選択され、引数はテストで宣言されたモックのみで解決されます。

    注:引数が見つからない場合は、null が渡されます。モックできない型が必要な場合、コンストラクターの挿入は行われません。このような場合、依存関係を自分で満たす必要があります。

  2. プロパティ セッター インジェクション。モックは最初に型によって解決されます。次に、同じ型のプロパティが複数ある場合は、プロパティ名とモック名の一致によって解決されます。

    注 1:同じタイプ (または同じ消去) のプロパティがある場合は、すべての @Mock アノテーション付きフィールドに一致するプロパティの名前を付けることをお勧めします。そうしないと、Mockito が混乱してインジェクションが発生しない可能性があります。

    注 2: @InjectMocks インスタンスが以前に初期化されておらず、引数のないコンストラクターがある場合、このコンストラクターで初期化されます。

  3. フィールドインジェクション; モックは最初に型によって解決され、次に同じ型のプロパティが複数ある場合は、フィールド名とモック名の一致によって解決されます。

    注 1:同じタイプ (または同じ消去) のフィールドがある場合は、すべての @Mock アノテーション付きフィールドに一致するフィールドの名前を付けることをお勧めします。そうしないと、Mockito が混乱してインジェクションが発生しない可能性があります。

    注 2: @InjectMocks インスタンスが以前に初期化されておらず、引数のないコンストラクターがある場合、このコンストラクターで初期化されます。

于 2013-03-11T17:45:15.787 に答える
3

複数のサービスがあり、Spring ベースの環境で DAO を Mock-Object に置き換えたい場合は、Springockito を使用することをお勧めします: https://bitbucket.org/kubek2k/springockito/wiki/Home

ここでも言及されています: MockitoモックをSpring Beanに注入する

Testclass は次のようになります。

@RunWith (SpringJUnit4ClassRunner.class)
@ContextConfiguration (loader = SpringockitoContextLoader.class, locations =    {"classpath:/org/example/package/applicationContext.xml"})
public class NameOfClassTest {

    @Autowired
    @ReplaceWithMock 
    StateDAO mockedStateDao;

    @Autowired
    @ReplaceWithMock 
    CountyDAO mockedCountyDao;

    @Autowired
    @ReplaceWithMock 
    VisitorDAO mockedVisitorDao;

@Test または @Before Methode で、モックを標準の Mockito の方法でセットアップできます。

Mockito.doReturn(null).when(mockedCountyDao).selectFromDB();
于 2014-02-03T16:18:53.327 に答える
1

静的メソッドMockitoAnnotations.initMocks(Object)は、プロセス全体をブートストラップするために使用されます。

ソースコードを参照していないため、どのように機能するかはわかりませんが、次のように実装します。

  1. アノテーションを使用して、渡された のクラスをスキャンしObjectてメンバー変数を探します。@Mock
  2. それぞれについて、そのクラスのモックを作成し、そのメンバーに設定します。
  3. アノテーションを使用して、渡された のクラスをスキャンしObjectてメンバー変数を探します。@InjectMocks
  4. 見つかった各メンバーのクラスをスキャンして、(2) で作成されたモック オブジェクトの 1 つを注入できるメンバーを探します (つまり、フィールドが親クラス/インターフェイス、または宣言されたモック オブジェクトと同じクラスである場合)。 class) を作成し、そのメンバーに設定します。
于 2013-03-05T16:36:12.483 に答える
0

気にしないで、オンラインで見てください- InjectMocks アノテーションは @Mock アノテーションを持つものをフィールドとして扱い、静的スコープ (クラス全体) であるため、モックが正しいサービスに送られることを本当に保証できませんでした。これは、クラス レベルではなく機能レベルで単体テストを試みるための思考実験でした。このようなものをSpringで自動配線すると思います...

于 2013-03-05T16:35:37.563 に答える