[解決済み] @RunWith(MockitoJUnitRunner.class) vs MockitoAnnotations.initMocks(this)
質問
新しい jUnit4 テストを作成する際に、(1) (2) (3) (4) (5) (6)のいずれかを使用するかどうか悩んでいます。
@RunWith(MockitoJUnitRunner.class)
を使うか、それとも
MockitoAnnotations.initMocks(this)
.
新しいテスト&を作成しました。ウィザードは自動的にRunnerを使ったテストを生成しました。MockitoJUnitRunnerのJavadocsには以下のように記載されています。
JUnit 4.4以降と互換性があり、このランナーには以下の動作が追加されます。
Mockでアノテーションされたモックを初期化するので、MockitoAnnotations.initMocks(Object)を明示的に使用する必要がありません。モックは各テストメソッドの前に初期化されます。 各テストメソッド終了後にフレームワークの使用状況を検証します。
Runnerを使うことで何か利点があるのかどうかは、私にはよくわかりません。
initMocks()
メソッドよりも利点があるかどうかはわかりません。
どのように解決するのですか?
MockitoJUnitRunner
は、フレームワークの使用に関する自動的な検証を行うだけでなく、自動的な
initMocks()
.
フレームワークの使用に関する自動検証は、実際に持つ価値があります。 このような間違いをした場合に、より良い報告をすることができます。
-
静的な
when
メソッドを呼び出しますが、スタブには一致するthenReturn
,thenThrow
またはthen
. (下記コードのエラー1) -
あなたは
verify
を呼び出したが、検証しようとしているメソッドの呼び出しを忘れてしまった。 を提供するのを忘れています。 (以下のコードのエラー2) -
を呼び出すと
when
メソッドの後にdoReturn
,doThrow
またはdoAnswer
でモックを渡しますが、スタブしようとしているメソッドを指定するのを忘れてしまいます。 を渡すことはできません。 (以下のコードのエラー3)
フレームワークの使用状況を検証していない場合、これらのミスが報告されるのは に続く がMockitoのメソッドを呼び出すまで報告されません。 これは次のようになるかもしれません。
- を同じテスト・メソッド内で使用する必要があります (下記のエラー 1 のように)。
- を次のテストメソッドで実行します(下記のエラー2のような)。
- 次のテストクラスで
もし、最後に実行したテストで発生した場合(下記のエラー3のように)、それらは全く報告されないでしょう。
これらのエラーの種類はそれぞれどのように見えるかを示しています。 ここでは、JUnitがこれらのテストをここに記載されている順番で実行すると仮定しています。
@Test
public void test1() {
// ERROR 1
// This compiles and runs, but it's an invalid use of the framework because
// Mockito is still waiting to find out what it should do when myMethod is called.
// But Mockito can't report it yet, because the call to thenReturn might
// be yet to happen.
when(myMock.method1());
doSomeTestingStuff();
// ERROR 1 is reported on the following line, even though it's not the line with
// the error.
verify(myMock).method2();
}
@Test
public void test2() {
doSomeTestingStuff();
// ERROR 2
// This compiles and runs, but it's an invalid use of the framework because
// Mockito doesn't know what method call to verify. But Mockito can't report
// it yet, because the call to the method that's being verified might
// be yet to happen.
verify(myMock);
}
@Test
public void test3() {
// ERROR 2 is reported on the following line, even though it's not even in
// the same test as the error.
doReturn("Hello").when(myMock).method1();
// ERROR 3
// This compiles and runs, but it's an invalid use of the framework because
// Mockito doesn't know what method call is being stubbed. But Mockito can't
// report it yet, because the call to the method that's being stubbed might
// be yet to happen.
doReturn("World").when(myMock);
doSomeTestingStuff();
// ERROR 3 is never reported, because there are no more Mockito calls.
}
さて、5年以上前に初めてこの回答を書いたとき、私はこう書きました。
ということで、私がお勧めするのは
MockitoJUnitRunner
を可能な限り使用することをお勧めします。 ただし、Tomasz Nurkiewiczが正しく指摘しているように、Springのような他のJUnitランナーが必要な場合は、これを使うわけにはいきません。
私の推奨は現在変更されています。 Mockitoチームは、私が最初にこの回答を書いてから、新しい機能を追加しました。 これはJUnitルールであり、その機能は
MockitoJUnitRunner
. しかし、他のランナーの使用を排除しないので、より優れています。
を含む。
@Rule
public MockitoRule rule = MockitoJUnit.rule();
をテストクラスで使用します。 これはモックを初期化し、フレームワークの検証を自動化します; ちょうど
MockitoJUnitRunner
がそうであるように。 しかし、今、あなたは
SpringJUnit4ClassRunner
や他のJUnitRunnerと同様に使用できます。 Mockito 2.1.0以降では、どのような問題が報告されるかを正確に制御するオプションが追加されています。
関連
-
エラー java.util.NoSuchElementException
-
undefinedeclipse エラー。この行に複数のアノテーションが見つかりました: - 文字列を型解決に解決できない
-
javaで非静的な解を静的な参照にすることができない
-
Android Studio 3.1.2 で v4, v7 パッケージが見つからない シンボル 'AppCompatActivity' を解決できない
-
VMの初期化中にエラーが発生しました java/lang/NoClassDefFoundError: java/lang/Object
-
node js npm gruntインストール、elasticsearch-head 5.Xインストール
-
マスキング このリソースにアクセスするには、完全な認証が必要です。
-
mavenプロジェクトのテストエラー java.lang.ClassNotFoundException: org.glassfish.jersey.client.ClientConfig の問題を解決する。
-
Exception: java.util.NoSuchElementException: 行が見つかりません
-
[解決済み] ランダムな文字列を使用するこのコードは、なぜ "hello world" と表示されるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Java エラー報告 スレッド "main" での例外 java.util.NoSuchElementException
-
java.util.NoSuchElementException 原因解析と解決方法
-
スタイルが読み込まれず、ブラウザのコンソールでエラーが報告される。リソースはスタイルシートとして解釈されますが、MIMEタイプtext/htmlで転送されます。
-
javaの実行中に「javaの例外が発生しました」と表示された場合はどうすればよいですか?
-
アクセス制限について アプリケーションの種類がAPIでない(必要なライブラリの制限)。
-
jd-gui Java Exceptionが発生しました。
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException: 1
-
起動時にEclipseエラーが発生しました。起動中に内部エラーが発生しました。java.lang.NullPoin: "Javaツーリングの初期化 "中に内部エラーが発生しました。
-
[解決済み] モックオブジェクトの初期化 - MockIto
-
[解決済み] JUnit5でMockitoを使用する方法