Mockitoでのjunitテストに@RunWith(MockitoJUnitRunner.class)
を使用していました。しかし、今私はスプリングブートアプリで作業しており、@RunWith(SpringRunner.class)
を使用しようとしています。 @RunWith(SpringRunner.class)
を使用すると、@RunWith(MockitoJUnitRunner.class)
を使用するよりも利点がありますか? @Injectmock
、@Mock
、@Spy
などの機能を@RunWith(SpringRunner.class)
で引き続き使用できますか
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
サポートを使用します。
SpringRunner.class
を使用すると、Springは対応する注釈を提供します。
@MockBean
@SpyBean
モックは、@Autowired
アノテーションを介してテスト対象のオブジェクトに注入されます。この機能を有効にするには、テストに注釈を付ける必要があります
@SpringBootTest
または
@TestExecutionListeners(MockitoTestExecutionListener.class)
詳細と例については、公式ドキュメントを参照してください。 モッキングとスパイイングBean
JavaDocによると:
SpringRunnerは
SpringJUnit4ClassRunner
のエイリアスです。このクラスを使用するには、JUnit 4ベースのテストクラスに@RunWith(SpringRunner.class)
アノテーションを付けます。 SpringTestContext
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
で十分です。 @Mock
とMockito.verify(...)
を使用するだけで、テストに合格します。そして、それはずっと速いです。
テストは高速でなければなりません。できるだけ早く。そのため、可能な限り、MockitoJUnit4Runner
を使用して高速化します。
単体テストと統合テストの両方に絶対にSpringRunnerを使用できます。 SpringRunner Tutorial