web-dev-qa-db-ja.com

Mockito:ゲッターセッターをスタブする方法

私はMockitoが初めての人で、get/setペアをどのようにスタブできるのかと思っていました。

例えば

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

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

22
Guillaume Polet

また、最近のセッター呼び出しの結果をゲッターに返してほしかった。

持っている

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));
34
user2006754

考えられるアプローチは3つあります。

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

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

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

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

7

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

_@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() method を実装します。したがって、セッターメソッドがテスト中のコードによって実行されるときはいつでも、そのセッターのこのスタブがそれを MutableObject ヘルパーオブジェクトに記録します。設定されたこの記録された値は、getter実装によって返されます。

0
entpnerd

この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

0
Lexandro