2011-12-08 22 views
3

私はこの例のようないくつかのメソッドを持つクラスを持っています。同じクラスから別のprivate voidメソッドを呼び出すメソッドをPowerMockでテストする方法は?

public class TestClass { 

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

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

    ... other methods ... 
} 

私はpowermockでaMethodテストしたいとすべてのメソッドは、voidMethod除いて正常に動作する必要があります。 voidMethodに何もしないように、私はTestClassの部分模擬を作成しました。しかし、私はこのメソッドの呼び出しを期待する方法がわかりません。

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

私は、2行目のエラーを取得しています:

型EasyMockのメソッドを期待(T)が(無効)

どのように引数には適用されません

私はこの問題を解決しましたか?このような

答えて

2

使用シンプルなコール:

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

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

+0

私は間違いがありましたが、behavior.voidMethodはaMethodから呼び出され、privateメソッドです.AwayメソッドからvoidMethodの呼び出しを期待しています。私のテストaMethodに関係がありますか? – shift66

+0

voidMethod()はprivateであるため、この回答は決してうまくいかず、コンパイルされません。 –

2

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

まず最初にすべきことは、あなたがしようとしていることが意味を成しているのか、本当に嘲笑される必要があるのか​​を検討することです。プライベートメソッドを嘲笑しているときは、コードの臭いを考慮してください。おそらくあなたはそれをする必要がありますが、通常、それを避ける方法があります。なぜあなたが嘲笑しているのかを批判的に考えるのは明らかですが、混乱して物事を逃すのは簡単です。

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

+0

これが質問に答えた場合は、回答としてマークしてもよろしいですか? – hotshot309

+0

私は最初にこの回答をupvotedしましたが、1日後に問題を再訪し、再現できません。どのようなshift66が例外なく私のために働くように頼んだか。 – Matt

関連する問題