Jock5でMockitoを使用する方法


103

MockitoおよびJUnit 5でインジェクションを使用するにはどうすればよいですか?

JUnit4では、@RunWith(MockitoJUnitRunner.class)アノテーションを使用できます。JUnit5には@RunWithアノテーションはありませんか?

回答:


145

Mockitoの使用方法はいくつかあります。1つずつ説明します。

手動で

Mockito::mockJUnitのバージョン(またはその問題のテストフレームワーク)に関係なく、手動でモックを作成します。

注釈ベース

使用@Mockのために-annotationと対応する通話をMockitoAnnotations::initMocks するためにモックを作成することは(そのことについてまたはテストフレームワークが、Java 9は、テストコードをモジュールにか終わるかどうかに応じて、ここに干渉する可能性)に関係なく、JUnitのバージョンの動作します。

Mockito拡張

JUnit 5には強力な拡張モデルがあり、Mockitoは最近、グループ/アーティファクトID org.mockitomockito-junit-jupiterの下に公開したものです。

拡張機能を適用する@ExtendWith(MockitoExtension.class)には、テストクラスに追加し、モックフィールドにで注釈を付けます@MockMockitoExtensionの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ランナーは使用できません。


6
MockitoJUnitRunner-> mockito-junit-jupiterに相当する公式のMockito Junit5拡張機能が追加されました
ダンカーター

Mockitoの公式拡張機能がリリースされたとき、構成する方法の詳細にブログ記事を書いて、それを使用する:solidsoft.wordpress.com/2018/03/27/...
マルチンZajączkowski

アノテーションが付けられたメソッドは@Testパブリックである必要がありますか、または「パッケージプライベート」で十分ですか?
オタク

Jupiter(「JUnit 5」と呼ばれることが多い)でテストを実行する場合、テストメソッドはパッケージから可視である必要があります。
ニコライ

57

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

    ...
}

6
@ExtendWith(MockitoExtension.class)@RunWith(MockitoJUnitRunner.class)JUnit4に相当
セルゲイネムチノフ

9

実行する方法はいくつかありますが、より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-jupiter2つの独立したライブラリに依存していること です。たとえば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-apiAPIの面で、多くの場合、まだ移動し、必ず同じバージョンの依存にするjunit-jupiter-apiことmockito-junit-jupiterに依存します。


mockito-junit-jupiterの適切なバージョンを取得しないのはなぜjunit-jupiter-apiですか?
haelix

@haelixこの依存関係に使用されるバージョン戦略はMockitoライブラリに依存しているためです。こちらのバージョンをご覧ください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用に設計されていることを伝えます。
davidxxx 2018年

MockitoExtensionmockito-coreバージョン3.0.0 には存在しないようです。
Thunderforge

1
@Thunderforgeこれはで定義されていますmockito-junit-jupiter
davidxxx

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.