私はMockitoが初めての人で、get/setペアをどのようにスタブできるのかと思っていました。
例えば
_public interface Dummy {
public String getString();
public void setString(String string);
}
_
どのようにしてそれらを正しく動作させることができますか:テストのどこかでsetString("something");
を呼び出した場合、getString()
に「何か」を返させたいです。それは実現可能ですか、それともそのようなケースを処理するためのより良い方法がありますか?
また、最近のセッター呼び出しの結果をゲッターに返してほしかった。
持っている
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));
考えられるアプローチは3つあります。
アプリケーションでHttpServletRequest
を直接使用しないでください。そのためのラッパークラスを作成し、ラッパークラスのインターフェイスを持ちます。アプリケーションで現在HttpServletRequest
を使用している場合は、代わりにインターフェースを使用してください。次に、テストで、このインターフェイスの代替実装を用意します。そうすれば、Mockitoモックはまったく必要ありません。
テストクラスに、String
に設定した値を格納するフィールドがあります。 2つのMockito Answer
オブジェクトを作成します。 getString
が呼び出されたときにこのフィールドの値を返すものと、setString
が呼び出されたときにこのフィールドの値を設定するものがあります。通常の方法でモックを作成し、これらの回答の両方を使用するようにスタブします。
HttpServletRequest
インターフェースを実装するが、設定したいフィールドを持ち、ゲッターとセッターを定義する抽象クラス(テストクラスの静的内部クラスにすることができます)を作成します。次に、抽象クラスをモックし、Mockito.CALLS_REAL_METHODSをデフォルトの回答として渡します。モックでゲッターまたはセッターを呼び出すと、実際のメソッドが起動します。これが目的の動作です。
うまくいけば、これらの3つの選択肢の1つがニーズを満たすでしょう。
私はこの問題を抱えていましたが、受け入れられた回答を使用したくありませんでした。そうすると、私の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実装によって返されます。
この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 )