1100

戻り値の型が void のメソッドをモックする方法は?

オブザーバー パターンを実装しましたが、方法がわからないため、Mockito でモックできません。

そして、インターネットで例を見つけようとしましたが、成功しませんでした。

私のクラスは次のようになります。

public class World {

    List<Listener> listeners;

    void addListener(Listener item) {
        listeners.add(item);
    }

    void doAction(Action goal,Object obj) {
        setState("i received");
        goal.doAction(obj);
        setState("i finished");
    }

    private string state;
    //setter getter state
} 

public class WorldTest implements Listener {

    @Test public void word{
    World  w= mock(World.class);
    w.addListener(this);
    ...
    ...

    }
}

interface Listener {
    void doAction();
}

システムはモックでトリガーされません。

上記のシステム状態を表示したい。そして、それらに従って主張を行います。

4

11 に答える 11

129

その質問に対するより簡単な答えを見つけたと思います.1つのメソッドだけに対して実際のメソッドを呼び出すには(voidリターンがある場合でも)、これを行うことができます:

Mockito.doCallRealMethod().when(<objectInstance>).<method>();
<objectInstance>.<method>();

または、次のようにして、そのクラスのすべてのメソッドに対して実際のメソッドを呼び出すことができます。

<Object> <objectInstance> = mock(<Object>.class, Mockito.CALLS_REAL_METHODS);
于 2014-06-10T20:41:15.020 に答える
91

@sateeshが言ったことに加えて、テストがそれを呼び出さないようにするためにvoidメソッドをモックしたいだけの場合は、次の方法を使用できますSpy

World world = new World();
World spy = Mockito.spy(world);
Mockito.doNothing().when(spy).methodToMock();

テストを実行する場合は、spyオブジェクトではなく、オブジェクトに対してテストでメソッドを呼び出すようにしてくださいworld。例えば:

assertEquals(0, spy.methodToTestThatShouldReturnZero());
于 2015-01-09T20:08:28.780 に答える
59

いわゆる問題の解決策は、 Mockito.mock(..)の代わりにspy Mockito.spy(...)を使用することです。mock

Spy を使用すると、部分的なモックを作成できます。Mockitoはこの問題が得意です。完全ではないクラスがあるため、このようにして、このクラスの必要な場所をモックします。

于 2010-02-18T08:48:41.580 に答える
45

まず第一に、常に mockito static をインポートする必要があります。これにより、コードがより読みやすく (そして直感的に) なります。

import static org.mockito.Mockito.*;

部分的なモッキングと残りの元の機能を維持するために、mockito は「スパイ」を提供します。

次のように使用できます。

private World world = spy(new World());

メソッドが実行されないようにするには、次のようなものを使用できます。

doNothing().when(someObject).someMethod(anyObject());

メソッドにカスタム動作を与えるには、「when」と「thenReturn」を使用します。

doReturn("something").when(this.world).someMethod(anyObject());

その他の例については、ドキュメントで優れた mockito サンプルを見つけてください。

于 2016-11-11T14:51:38.767 に答える
16

束に別の答えを追加します(しゃれは意図していません)...

スパイを使用したくない場合は、doAnswer メソッドを呼び出す必要があります。ただし、必ずしも独自のAnswerを作成する必要はありません。デフォルトの実装がいくつかあります。特に、CallsRealMethods .

実際には、次のようになります。

doAnswer(new CallsRealMethods()).when(mock)
        .voidMethod(any(SomeParamClass.class));

または:

doAnswer(Answers.CALLS_REAL_METHODS.get()).when(mock)
        .voidMethod(any(SomeParamClass.class));
于 2014-03-19T17:41:48.613 に答える