65

UnfinishedVerificationException私がすべて正しくやったと思うと、Mockito が を投げているように見えます。これが私の部分的なテストケースです:

HttpServletRequest req = mock(HttpServletRequest.class);
when(req.getHeader("Authorization")).thenReturn("foo");

HttpServletResponse res = mock(HttpServletResponse.class);

classUnderTest.doMethod(req, res); // Use the mock

verify(res, never());
verify(req).setAttribute(anyString(), anyObject());

そして、ここに部分的なクラスとメソッドがあります:

class ClassUnderTest extends AnotherClass {
    @Override
    public String doMethod(ServletRequest req, ServletRequest res) {
        // etc.
        return "someString";
    }
}

所有していないインターフェイスを決してモックしてはならないという事実を無視して、なぜ Mockito から次のメッセージが表示されるのでしょうか?

org.mockito.exceptions.misusing.UnfinishedVerificationException: 
Missing method call for verify(mock) here:
-> at (redacted)

Example of correct verification:
    verify(mock).doSomething()

Also, this error might show up because you verify either of: final/private/equals()/hashCode() methods.
Those methods *cannot* be stubbed/verified.

at [test method name and class redacted]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37)
at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62)
at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
... etc
4

17 に答える 17

103

verifyこれは、次のプリミティブ引数を期待するメソッドを実行しようとした場合にも発生する可能性がありますany()

たとえば、メソッドに次のシグネチャがあるとします。

method(long l, String s);

そして、このように検証しようとすると、前述のメッセージで失敗します:

verify(service).method(any(), anyString());

に変更するanyLong()と動作します:

verify(service).method(anyLong(), anyString());
于 2015-06-27T05:24:14.083 に答える
82

私はこれを自分で見つけたばかりで、多くの混乱を引き起こしました。

Davidが前述したように、Mockitoは次のMockitoメソッド呼び出しでエラーを報告しますが、これは同じテストメソッドにない可能性があります。例外メッセージにはエラーが発生した実際の場所への参照が含まれていますが、間違ったテストがテストプロセスに逆効果で失敗していることがわかります。そして、テストが単純であればあるほど、次のテストでエラーが発生する可能性が高くなります!

エラーが正しいテスト メソッドで確実に表示されるようにする簡単な修正方法を次に示します。

@After
public void validate() {
    validateMockitoUsage();
}

ここのMockitoドキュメントから:

Mockito を誤用すると例外がスローされるため、テストが正しく記述されているかどうかがわかります。落とし穴は、次回フレームワークを使用するときに Mockito が検証を行うことです (たとえば、次回の検証、スタブ、モックの呼び出しなど)。ただし、次のテストで例外がスローされる可能性がありますが、例外メッセージには、ナビゲート可能なスタック トレース要素と欠陥の場所が含まれています。したがって、Mockito が誤用された場所をクリックして見つけることができます。

ただし、フレームワークの使用法を明示的に検証したい場合もあります。たとえば、ユーザーの 1 人は @After メソッドに validateMockitoUsage() を入れて、Mockito を誤用したときにすぐにわかるようにしたいと考えていました。それがなければ、彼は次にフレームワークを使用したときよりも早くそれについて知っていただろう. @After で validateMockitoUsage() を使用するもう 1 つの利点は、通常の「次回」の検証では次のテスト メソッドが失敗する可能性があるのに対し、jUnit ランナーは常に欠陥のあるテスト メソッドで失敗することです。ただし、JUnit が次のテストを赤色で報告する場合でも、心配する必要はありません。例外メッセージ内のナビゲート可能なスタック トレース要素をクリックするだけで、mockito を誤用した場所を即座に特定できます。

于 2014-03-21T04:18:01.910 に答える
5

私の場合、kotlinを使用したのは、テストする関数が として宣言されていなかったためopenです。

final例外は、 /private/equals/hash メソッドを使用できないことを通知します。

fun increment(){
        i++
    }

open fun increment(){
        i++
    }
于 2020-02-14T16:56:46.317 に答える
2

クラス MyRepository で同様の例外がありました

org.mockito.exceptions.misusing.UnfinishedVerificationException: ここに verify(mock) のメソッド呼び出しがありません: -> at MyRepository$$FastClassBySpringCGLIB$$de8d8358.invoke()

正しい検証の例:

verify(mock).doSomething()

MyRepository のインターフェイスとモック インターフェイスを作成したときに問題は解決しましたが、実装は作成しませんでした。春はいくつかの CGLIB プロキシを作成し、UnfinishedVerificationException 例外につながるようです。

于 2016-06-14T07:51:33.257 に答える
0

テストは個別に正常に実行されますが、統合テスト スイートの実行中に UnfinishedVerificationException で失敗します。この問題は、mockito から verify() を使用し、@EnableRetry を使用すると発生します。これに対する回避策は、使用することです

public static <T> T unwrapAndVerify(T mock, VerificationMode mode) { return ((T) Mockito.verify(AopTestUtils.getTargetObject(mock), mode)); }

このhttps://html.developreference.com/article/15741255/Mocked+Spring+%23Service+that+has+%23Retryable+annotations+on+methods+fails+with+UnfinishedVerificationExceptionで述べたように。

于 2020-07-17T16:19:20.433 に答える
-1

あなたの「classUnderTest」がどこから来たのかはわかりませんが、実際のものではなく、嘲笑されていることを確認してください。以下のテストケースでも同じ問題があります。

MyAgent rpc = new MyAgent("myNodeName");
...
rpc.doSomething();
...
PowerMockito.verifyPrivate(rpc).invoke("initPowerSwitch");
PowerMockito.verifyPrivate(rpc).invoke("init", "192.168.0.23", "b2", 3);

ただし、次のテストケースでは消えています。

MyAgent rpc = PowerMockito.spy(new MyAgent("myNodeName"));
...
rpc.doSomething();
...
PowerMockito.verifyPrivate(rpc).invoke("initPowerSwitch");
PowerMockito.verifyPrivate(rpc).invoke("init", "192.168.0.23", "b2", 3);

注意、 Object rpc はPowerMockito.spy(...)でモックする必要があります。

于 2018-06-13T08:08:49.737 に答える