私がテストしているクラスは依存関係をとり、その依存関係の関数を呼び出します。その関数は引数として複雑なオブジェクトをとり、結果を生成します。さて、私は依存関係を模擬し、渡された引数に基づいて何かを返すようにしたいと思います。単純化された作業バージョンを以下に示します。模擬クラスの引数マッチングにJava8 lambdaを使用する
when
メソッドでJava 8ラムダ式を使用してArgHasNext
クラスを削除できますか?下のコメントされたコード(コンパイルされない)のようなもの。
class ArgHasNext implements ArgumentMatcher<Arg> {
public boolean matches(Arg arg) {
return arg.hasNext();
}
@Override
public boolean matches(Object o) {
return matches((Arg)o);
}
}
@RunWith(MockitoJUnitRunner.class)
public class ArgumentMatcherTest {
@Mock
private Dependency dep = mock(Dependency.class);
@Test
public void test() {
when(dep.func(argThat(new ArgHasNext()))).thenReturn(true);
// when(dep.func(argThat((Arg a) -> a.hasNext()))).thenReturn(true);
// when(dep.func(argThat((Arg a) -> !a.hasNext()))).thenReturn(false);
Sut sut = new Sut(dep);
assertEquals(sut.method(new Arg(true)), "True");
assertEquals(sut.method(new Arg(false)), "False");
}
}
class Arg {
private boolean hasNext;
public Arg(boolean hasNext) {
this.hasNext = hasNext;
}
public boolean hasNext() {
return this.hasNext;
}
}
class Sut {
private Dependency dep;
public Sut(Dependency dep) {
this.dep = dep;
}
public String method(Arg arg) {
if (dep.func(arg)) {
return "True";
}
else {
return "False";
}
}
}
class Dependency {
public boolean func(Arg arg) {
if (arg.hasNext()) {
return true;
}
return false;
}
}
私はMockitoコアバージョン2.0.54-βを使用しています。
EDIT わかりました。実際の場合、依存性func
メソッドは、テストされたメソッドが返される前にSUT
で処理されるページングされたクエリ結果を返します。 Arg
に応じて、私は依存関係func
が最初に呼び出されたときにページ1の結果を返し、ページ2が2回目の結果を返すようにします。私はモックが関数呼び出しに渡された引数に基づいて異なる値を返すようにすることができます。これはMockitoのlambdasを使って可能ですか?今
ちょうど不思議なことに、なぜあなたは何歳の2.0ベータ版を使用していますか?そしておそらく、ここでラムダを使ってどのように想像しているのか、例を挙げられますか? – GhostCat
@GhostCatテストメソッドの2つのコメント行を見てください。私はそれらの2つの行がはるかに表現力があると思う(彼らが働くならば)。 ArgumentMatcher派生クラスは機能しますが、明白ではありません。 – MvdD
多分私は何かを逃していますが、間違った場所にあなたの時間を投資していると思います。私の答えを見てください。 – GhostCat