web-dev-qa-db-ja.com

@RunWith(SpringRunner.class)vs @RunWith(MockitoJUnitRunner.class)

Mockitoでのjunitテストに@RunWith(MockitoJUnitRunner.class)を使用していました。しかし、今私はスプリングブートアプリで作業しており、@RunWith(SpringRunner.class)を使用しようとしています。 @RunWith(SpringRunner.class)を使用すると、@RunWith(MockitoJUnitRunner.class)を使用するよりも利点がありますか? @Injectmock@Mock@Spyなどの機能を@RunWith(SpringRunner.class)で引き続き使用できますか

15
user8710021

SpringRunnerは、Spring ApplicationContextのロードと、テストインスタンスへのBean @Autowiredのサポートを提供します。 実際にはそれよりもはるかに多くのことを行います(Spring Reference Manualに記載されています)が、それは基本的な考え方です

一方、MockitoJUnitRunnerは、Mockitoでモックとスパイを作成するためのサポートを提供します。

ただし、JUnit 4では、一度に使用できるRunnerは1つだけです。

したがって、SpringとMockitoのサポートを同時に使用する場合は、これらのランナーのoneのみを選択できます。

しかし、SpringとMockitoの両方がrunnersに加えてrulesを提供しているので、あなたは幸運です。

たとえば、次のようにMockitoルールでSpringランナーを使用できます。

@RunWith(SpringRunner.class)
@SpringBootTest
public class MyTests {

    @Rule
    public MockitoRule rule = MockitoJUnit.rule();

    @Mock
    MyService myService;

    // ...
}

ただし、通常、Spring Bootを使用していて、Spring ApplicationContextからbeanをモックする必要がある場合は、単に@MockBeanではなく、Spring Bootの@Mockサポートを使用します。

23
Sam Brannen

SpringRunner.classを使用すると、Springは対応する注釈を提供します。

  • @MockBean
  • @SpyBean

モックは、@Autowiredアノテーションを介してテスト対象のオブジェクトに注入されます。この機能を有効にするには、テストに注釈を付ける必要があります

  • @SpringBootTest

または

  • @TestExecutionListeners(MockitoTestExecutionListener.class)

詳細と例については、公式ドキュメントを参照してください。 モッキングとスパイイングBean

5
VaL

JavaDocによると:

SpringRunnerはSpringJUnit4ClassRunnerのエイリアスです。このクラスを使用するには、JUnit 4ベースのテストクラスに@RunWith(SpringRunner.class)アノテーションを付けます。 Spring TestContext Frameworkをこのランナー以外のランナーで使用する場合は、org.springframework.test.context.junit4.rules.SpringClassRuleおよびorg.springframework.test.context.junit4.rules.SpringMethodRuleを使用します。

そしてTestContextのJavaDoc:

TestContextは、テストが実行されるコンテキストをカプセル化し、使用中の実際のテストフレームワークに依存しません。

メソッドgetApplicationContext()のそれ:

キャッシュされている可能性があるこのテストコンテキストのアプリケーションコンテキストを取得します。このメソッドの実装は、対応するコンテキストがまだロードされていない場合、アプリケーションコンテキストをロードし、潜在的にコンテキストもキャッシュします。

そのため、SpringRunnerはコンテキストをロードし、それを維持する責任があります。たとえば、H2インメモリデータベースなどの組み込みデータベースにデータを保持する場合は、SpringRunner.class;を使用する必要があります。そして、各テストの後に挿入したレコードを取り除くためにテーブルをクリーンアップするには、テストに@DirtiesContextアノテーションを付けて、Springにクリーンアップするように指示します。

しかし、これはすでに統合テストまたはコンポーネントテストです。テストが純粋な単体テストの場合、DBをロードする必要はありません。または、依存関係のメソッドが呼び出されることを確認するだけで、MockitoJUnit4Runnerで十分です。 @MockMockito.verify(...)を使用するだけで、テストに合格します。そして、それはずっと速いです。

テストは高速でなければなりません。できるだけ早く。そのため、可能な限り、MockitoJUnit4Runnerを使用して高速化します。

2
WesternGun

単体テストと統合テストの両方に絶対にSpringRunnerを使用できます。 SpringRunner Tutorial

0
Anand Chouksey