MockitoおよびJUnit 5でインジェクションを使用するにはどうすればよいですか?
JUnit4では、@RunWith(MockitoJUnitRunner.class)
アノテーションを使用できます。JUnit5には@RunWith
アノテーションはありませんか?
MockitoおよびJUnit 5でインジェクションを使用するにはどうすればよいですか?
JUnit4では、@RunWith(MockitoJUnitRunner.class)
アノテーションを使用できます。JUnit5には@RunWith
アノテーションはありませんか?
回答:
Mockitoの使用方法はいくつかあります。1つずつ説明します。
Mockito::mock
JUnitのバージョン(またはその問題のテストフレームワーク)に関係なく、手動でモックを作成します。
使用@Mockのために-annotationと対応する通話をMockitoAnnotations::initMocks
するためにモックを作成することは(そのことについてまたはテストフレームワークが、Java 9は、テストコードをモジュールにか終わるかどうかに応じて、ここに干渉する可能性)に関係なく、JUnitのバージョンの動作します。
JUnit 5には強力な拡張モデルがあり、Mockitoは最近、グループ/アーティファクトID org.mockito:mockito-junit-jupiterの下に公開したものです。
拡張機能を適用する@ExtendWith(MockitoExtension.class)
には、テストクラスに追加し、モックフィールドにで注釈を付けます@Mock
。MockitoExtension
のJavaDoc から:
@ExtendWith(MockitoExtension.class)
public class ExampleTest {
@Mock
private List list;
@Test
public void shouldDoSomething() {
list.add(100);
}
}
MockitoExtensionのドキュメントでは、モックをインスタンス化する他の方法について説明しています。たとえば、コンストラクターインジェクションを使用します(テストクラスの最終フィールドをrpeferする場合)。
JUnit 4のルールとランナーはJUnit 5では機能しないため、MockitoRule
およびMockitoランナーは使用できません。
@Test
パブリックである必要がありますか、または「パッケージプライベート」で十分ですか?
Mockitoを使用しMockitoExtension
ます。拡張機能は新しいアーティファクトに含まれていますmockito-junit-jupiter
:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>2.23.4</version>
<scope>test</scope>
</dependency>
JUnit 4の場合と同じように、テストを作成できます。
import org.mockito.junit.jupiter.MockitoExtension;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
@ExtendWith(MockitoExtension.class)
class MyTest {
@Mock
private Foo foo;
@InjectMocks
private Bar bar; // constructor injection
...
}
@ExtendWith(MockitoExtension.class)
@RunWith(MockitoJUnitRunner.class)
JUnit4に相当
実行する方法はいくつかありますが、よりorg.junit.jupiter.api.extension.Extension
明確な方法であり、JUnit 5の哲学がMockitoのを作成することも尊重しています 。
1)モックを手動で作成すると、フレームワークを正しく使用するための追加のMockitoチェックの利点が失われます。
2)MockitoAnnotations.initMocks(this)
すべてのテストクラスの呼び出しは、ボイラープレートコードであり、回避することができます。
また、このセットアップを抽象クラスで作成することも良い解決策ではありません。
すべてのテストクラスを基本クラスに結合します。
正当な理由で新しい基本テストクラスが必要な場合は、3レベルのクラス階層で終了します。それは避けてください。
3)テストルールはJUnit 4固有のものです。
それさえ考えないでください。
そして、ドキュメントはそれについて明確です:
ただし、JUnit 5の新しい拡張機能を開発する場合は、JUnit 4のルールベースモデルではなく、JUnit Jupiterの新しい拡張モデルを使用してください。
4)テストランナーは、JUnit 5フレームワークを拡張する方法ではありません。
JUnit 5は、JUnit 5拡張機能のおかげでテストを作成するための拡張モデルを提供することにより、JUnit 4のランナーの地獄を簡素化しました。
それさえ考えないでください。
だからorg.junit.jupiter.api.extension.Extension
方法を支持する。
編集:実際には、Mockitoは木星拡張をバンドルしています: mockito-junit-jupiter
次に、使用するのは非常に簡単です:
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
public class FooTest {
...
}
ここにジョナサンの優れた答えへの追加があります。
依存関係としてmockito-junit-jupiter
アーティファクトを追加することにより、を使用すると@ExtendWith(MockitoExtension.class)
、テストの実行時に次の例外が生成されました。
java.lang.NoSuchMethodError:org.junit.platform.commons.support.AnnotationSupport.findAnnotation(Ljava / util / Optional; Ljava / lang / Class;)Ljava / util / Optional;
問題は、mockito-junit-jupiter
2つの独立したライブラリに依存していること です。たとえばmockito-junit-jupiter:2.19.0
:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.19.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.1.0</version>
<scope>runtime</scope>
</dependency>
問題は私が使用したことjunit-jupiter-api:5.0.1
でした。
ようにjunit-jupiter-api
APIの面で、多くの場合、まだ移動し、必ず同じバージョンの依存にするjunit-jupiter-api
ことmockito-junit-jupiter
に依存します。
mockito-junit-jupiter
の適切なバージョンを取得しないのはなぜjunit-jupiter-api
ですか?
mockito-junit-jupiter:2.19.0
。JUnit Jupiterのバージョンはで始まり5
ます。mockito-junit-jupiterは、アーティファクト識別子で2つのこと(MockitoバージョンとJUnit Jupiterバージョン)を指定して、物事をより明確にする必要があります。たとえばmockito-junit-jupiter-5.1:2.19.0
、ライブラリがJUnit Jupiter 5.1用に設計されていることを伝えます。
MockitoExtension
mockito-core
バージョン3.0.0 には存在しないようです。
mockito-junit-jupiter