26

私はMockitoに少し慣れていないので、get/setペアをスタブする方法を考えていました。

例えば

public interface Dummy {
     public String getString();
     public void setString(String string);
}

どうすればそれらを適切に動作させることができますか。テストのどこかで呼び出した場合、「何か」を返しsetString("something");たいと思います。getString()それは実行可能ですか、それともそのようなケースを処理するためのより良い方法がありますか?

4

5 に答える 5

41

また、ゲッターが最近のセッターコールの結果を返すようにしたかったのです。

持っている

class Dog
{
    private Sound sound;

    public Sound getSound() {
        return sound;
    }
    public void setSound(Sound sound)   {
        this.sound = sound;
    }
}

class Sound
{
    private String syllable;

    Sound(String syllable)  {
        this.syllable = syllable;
    }
}

セッターをゲッターに接続するために、以下を使用しました。

final Dog mockedDog = Mockito.mock(Dog.class, Mockito.RETURNS_DEEP_STUBS);
// connect getter and setter
Mockito.when(mockedDog.getSound()).thenCallRealMethod();
Mockito.doCallRealMethod().when(mockedDog).setSound(Mockito.any(Sound.class));
于 2013-01-24T08:41:39.957 に答える
7

私は3つの可能なアプローチを考えることができます。

  1. HttpServletRequestアプリケーションで直接使用しないでください。そのためのラッパークラスを作成し、ラッパークラスのインターフェイスを用意します。アプリケーションで現在使用HttpServletRequestしている場所では、代わりにインターフェイスを使用してください。次に、テストで、このインターフェイスの代替実装を用意します。そうすれば、Mockitoモックはまったく必要ありません。

  2. に設定した値を格納するフィールドをテストクラスに用意しStringます。2つのMockitoAnswerオブジェクトを作成します。1つは、が呼び出されたときにこのフィールドの値を返すもので、もう1つは、getStringが呼び出されたときにこのフィールドの値を設定するものですsetString。通常の方法でモックを作成し、スタブしてこれらの両方の回答を使用します。

  3. インターフェイスを実装する抽象クラス(テストクラスの静的内部クラスにすることができます)を作成しHttpServletRequestますが、設定するフィールドがあり、ゲッターとセッターを定義します。次に、抽象クラスをモックし、Mockito.CALLS_REAL_METHODSをデフォルトの回答として渡します。モックでゲッターまたはセッターを呼び出すと、実際のメソッドが開始されます。これは、必要な動作です。

うまくいけば、これらの3つの選択肢の1つがあなたのニーズを満たすでしょう。

于 2012-04-19T06:01:38.040 に答える
2

私はこれがうまくいくことを発見しました:

doAnswer(answer -> when(dummy.getString()).thenReturn((String) answer.getArguments()[0]))
    .when(dummy).setString(any());

セッターはvoidメソッドであるため、doAnswer(..)。when(..)を使用する必要があります。セッターがオブジェクトで呼び出されると、ゲッターは同じオブジェクトで応答するように設定されます。

インターフェイスはあるが実装がない場合に非常に便利です。

于 2020-10-26T11:31:29.437 に答える
0

HttpServletRequestスタブのこの特定のケースでは、Spring-Mockフレームワークを使用することを強くお勧めします:(http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/mock/web/package- summary.html

Webベースの操作用のモックが組み込まれています。

それ以外の場合は、回答を使用して、モックオブジェクトに対する独自の応答を定義します(http://mockito.googlecode.com/svn/branches/1.8.5/javadoc/org/mockito/stubbing/Answer.html

于 2012-04-18T23:14:26.633 に答える
0

私はこの問題を抱えていましたが、受け入れられた答えに行きたくありませんでした。そうすることで、私のBean内のすべてのゲッターとセッターのモックが停止するからです。私が欲しかったのは、すべてではなく、単一のゲッター/セッターペアのスタブを作成することでした。そのため、次のコードを使用しました。

@Mock
private Dummy mockDummy;
private final MutableObject<String> stringWrapper = new MutableObject<>();

public TestClass() {
    MockitoAnnotations.initMocks(this);

    doAnswer(invocationOnMock -> {
        String injectedString = (String)invocationOnMock.getArguments()[0];
        TestClass.this.stringWrapper.setValue(injectedString);
        return null;
    }).when(this.mockDummy).setString(any());
    when(this.mockDummy.getString()).thenAnswer(
            invocationOnMock -> TestClass.this.stringValue.getValue());
}

最初のラムダはAnswer<Void>匿名クラスのanswer()メソッドを実装します。したがって、setterメソッドがテスト対象のコードによって実行されるたびに、そのsetterのこのスタブはそれをMutableObjectヘルパーオブジェクトに記録します。設定されたこの記録された値は、getter実装によって返される可能性があります。

于 2018-05-31T06:08:32.000 に答える