2

レガシー アプリケーションに 1500 個の spring.xml があるとします。サービスの単体テストを書きたいと思っています。私は依存地獄の奥深くにいます。アプリをそのまま受け入れるしかありません。

そのため、spring-3.something と mockito-1.9 を使用しており、サービスをテストする良い方法が必要です。新しいコードは @Autowired アノテーションを頻繁に使用します。

間接的に、このサービスは、実際にテストで使用したい ~25 のヘルパー (ファクトリ メソッドなど) と、このテストでは関心のない ~25 のオブジェクトを使用します。

現在、上記の方法でコンテキストをセットアップしようとしていますが、@Mock、@InjectMocks、@Autowired の効果について混乱しています。

私のテストを以下に示します。正しくセットアップするにはサポートが必要です。

質問:

  • @InjectMocks の実際の効果は何ですか?
  • どの自動配線された Bean が実際に使用され、どれがモックに置き換えられるかを (技術的に) どのように判断できますか?
  • 私は知っています、偽物を得るためにモックを悪用しています。ワンライナーで偽物を入手する簡単な方法はありますか?
  • *私はそのようなサービスをたくさん持っているので、これを理解したいことに注意してください... *

これが私のサンプルです:

@ContextConfiguration(locations = {
    "classpath:/some/path/MainTestConfig.spring.xml"
})
@RunWith(SpringJUnit4ClassRunner.class)
public class SampleTest {

    // ***            Uninteresting Dependencies to be mocked        *** //
    @Mock Mock1 mock1;
    @Mock Mock2 mock2;

    /** Service under test */
    @Autowired
    SomeService service;

    // ***            Tightly coupled helpers to be used              *** //
    @Autowired Helper1 helper1
    @Autowired Helper2 helpr2

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(SampleTest.class);
    }

    @Test
    public void testSample() {

        // prepare dummy context
        SomeContext context = new Context();

        // define expected result
        int expectedValue = 42;

        //execute method under test, record result
        Result actualResult = service.execute(context);

        //make assertions on result
        assertTrue(actualResult.getSomething()==expectedValue);
    }

}
4

2 に答える 2

4

これは、@Mock、@Autowired、および @InjectMocks に関する実際の質問に適切に対処する必要があるため、これを別の回答として投稿したかったのです。

@Mock:が呼び出されたmock(MyClass.class)ときに( を使用して) モックとして作成する必要があるフィールドをマークします。MockitoAnnotations.initMocks(this)

@Autowired: Spring によって割り当てられる必要があるフィールドを、クラス/インターフェースを実装する Bean でマークします。

@InjectMocks: が呼び出されたときに Mockito によって作成されるフィールドをマークしますMockitoAnnoations.initMocks(this)。クラスのインスタンスを作成し、@Mock注釈付きフィールドをこのインスタンスに挿入します。(コメント内のこのステートメントの修正を参照してください)。

分析:

@InjectMocksSpring コンテキストと互換性がなく、クラスの新しいインスタンスを作成する@AutowiredためInjectMock、Spring インスタンスを使用しません。

探していることを行うには、Springockitoを使用する必要があります。(遅延更新) Springockito を使用すると、Spring コンテキストにモックを挿入できるため、それらのモックをAutowired候補として使用できます。モックとスパイを可能にします。テストの同じフィールドでReplaceWithMockとを使用するのが一般的な方法です (wiki の例に示されているように)。Autowired

于 2013-04-15T14:52:45.133 に答える
2

最初の質問ですが、このテストを行うためにスプリング コンテキストをロードする必要がありますか? 通常、Spring プロジェクトがある場合、コンテキスト ファイルをロードしないクラスごとに 1 つの UNIT テストがあります。別の CONTEXT テストを使用して、コンテキスト ファイルをロードし、正しくロードされることを確認します。真の単体テストを行っている場合は、コンテキストをロードしないことをお勧めします。テスト対象のクラス@Autowiredが依存関係を割り当てるために使用する場合 (したがってセッターがない場合)、Spring を使用ReflectionTestUtilsしてそれらのフィールドを割り当てます。

于 2013-04-15T12:19:11.260 に答える