1

Mockitoを使用して呼び出されたかどうかを確認するにはどうすればよいですか - MCVEクラスが与えられた場合、実際に後で呼び出さbar(Alpha, Baz)ずに:bar(Xray, Baz)Foo

public class Foo {
    public String bar(Xray xray, Baz baz) {
        return "Xray";
    }

    public String bar(Zulu zulu, Baz baz) {
        return "Zulu";
    }

    public String bar(Alpha alpha, Baz baz) {
        if(alpha.get() instanceof Xray) {
            return bar((Xray)alpha.get(), baz);
        } else if(alpha.get() instanceof Zulu) {
            return bar((Zulu)alpha.get(), baz);
        } else {
            return null;
        }
    }
}

現在、おおよそ次の Mockito 拡張 JUnit テストがあります。

@Test
public void testBar_callsBarWithXray() {
    Baz baz = new Baz(); //POJOs
    Alpha alpha = new Alpha();
    alpha.set(new Xray());

    Foo foo = new Foo();
    Foo stub = spy(foo); // Spying on Foo, as I want to call the real bar(Alpha, Baz)
    // Preventing bar(Xray, Baz) from being called by providing behavior/stub
    when(stub.bar(any(Xray.class), any(Baz.class))).thenReturn("ok");
    // Calling the real "parent" method
    stub.bar(alpha, baz);
    // Testing if bar(Xray, Baz) was called by bar(Alpha, Baz)
    verify(stub, times(1)).bar(any(Xray.class), any(Baz.class));
}

そしてそれは失敗します:

org.mockito.exceptions.verification.TooManyActualInvocations:
foo.bar(
    <any>,
    <any> ); 
Wanted 1 time:
-> at FooTest.testBar_callsBarWithXray(FooTest.java:14) 
But was 2 times. Undesired invocation:
-> at FooTest.testBar_callsBarWithXray(FooTest.java:12)

any(Class.class)は何にでも一致し、型チェックを行わないためだと思います...したがって、Mockito の観点からは、実際には inと in (12 行目)のbar()2 回呼び出しています。FooFooTest

テストで実際にやりたいことを実行するにはどうすればよいですか:bar(Xray, Baz)呼び出し時にbar(Alpha, baz)(同時に への呼び出しをインターセプトしながらbar(Xray, Baz)) が呼び出されたことを確認しますか?

eq()Matcher ( )を使用するwhen(stub.bar(eq(Xray.class), any(Baz.class))...とコンパイル エラーが発生しますが、Cannot resolve method 'bar(Class<Xray>, Baz)'とにかくそのように使用するべきではありません (eq(xray)おそらくもっと似ているでしょう)...

また、関連するメモとして、 のオーバーロードを作成しようとするとbar(Alpha, Baz) private、次のようなコンパイル エラーが発生しますFooTest

エラー:(10, 12) java: bar(Xray,Baz) は Foo にプライベート アクセスを持っています

PowerMockito を使用して回避する方法はありますか? どのように?(明らかに、私は呼び出しを数えたいだけですbar(Xray, Baz)- のすべてのオーバーロードへのすべての呼び出しを数えることbar()は問題外です...)

eq(xray)テストの 10 行目と 14 行目の代わりに を使用するだけでうまくいきますが、オブジェクトである限り、どの(特定の) Xray オブジェクトが の引数として渡されるかについてany(Xray.class)はあまり興味がありません...bar() Xray

更新:ディスカッションの「PowerMockito とメソッド」の部分について別の質問を投稿し、これをメソッドで機能させる方法を見つけました。参照。以下の私のコメントprivatepublic

4

1 に答える 1