3

例のようないくつかのメソッドを持つクラスがあります。

public class TestClass {

    public boolean aMethod()
    {
        voidMethod();
        return true;
    }

    private void voidMethod()
    {
        ... does something ...
    }

    ... other methods ...
}

aMethodpowermock でテストしたいのですが、 voidMethod. TestClass何もしないようにするための部分的なモックを作成しましたがvoidMethod、このメソッドの呼び出しを期待する方法がわかりません。

testObject = createPartialMock(TestClass.class, "voidMethod");
expectPrivate(testObject, "voidMethod");

2 行目でエラーが発生します。

EasyMock 型の expect(T) メソッドは、引数 (void) には適用できません。

この問題を解決するにはどうすればよいですか?

4

2 に答える 2

2

PowerMock はプライベート void メソッドをモックできないようです (値が返されるプライベート メソッドのみ)。それらは、明示的にそれを言うために、より有用なコンパイラエラーを実際に提供する必要があります。EasyMock はプライベート メソッドをまったくモックしません。@StanislawLeventhal の回答は、EasyMock を使用した非プライベート void メソッドへの呼び出しを期待 (記録) するための構文を参照しています。

あなたが最初にすべきことは、あなたがやろうとしていることは理にかなっているのか、本当に嘲笑する必要があるのか​​ を検討することです. プライベート メソッドをモックしている場合は、コードの臭いと考えてください。必要があるかもしれませんが、通常は回避する方法があります。なぜ嘲笑しているのかを批判的に考えるのは当然のことのように思えますが、混乱したり、物事を見落としたりするのは簡単です。

直接呼び出すことができず、代わりにモックする必要があるのに、値を返さないプライベート メソッドをテスト クラスに含める必要があるのはなぜでしょうか。モッキングは通常、メソッドから返されるものを制御するために使用されます。ここでは、基本的にこのメソッドを呼び出す必要があると言っていますが、その実装を何もオーバーライドしたくない (私が正しく理解している場合)。これがテストクラスで役立つ、または必要になる状況を考えられるかどうかはわかりません。あなたが提供した例は、背後にある理由を理解するにはあまりにも一般化されていますが、目標を達成するためのより良い方法があるかどうかを確認する必要があります.

于 2012-11-30T19:05:38.040 に答える
2

次のような単純な呼び出しを使用します。

testObject.voidMethod(); // don't use "expect" for voids
expectLastCall().times(3); // use this for expectations

reply()そして、すべての期待のverify()後、テスト済みのコードを実行した後も忘れないでください。

于 2011-12-08T06:26:44.457 に答える