私はPowerMockito
とspy
を使用してプライベートメソッドをモックしています:
final SomeClass someClass = new SomeClass();
final SomeClass spy = PowerMockito.spy(someClass);
PowerMickito.doReturn("someValue", spy, "privateMethod1");
final String response = Whitebox.invokeMethod(spy, "anotherPrivateMethod");
// I can now verify `response` is of the correct data
// But I also want to verify `privateMethod1` was called x times or so
メソッドがx回呼び出されたことを確認する方法がわかりません。
補足
すべてのプライベートメソッドをprotected
にしてから、そのクラスをテストクラスで拡張してそれを行う方が良いですか。
これで十分です。
PowerMockito.doReturn("someValue", spy, "privateMethod1");
final String response = Whitebox.invokeMethod(spy, "anotherPrivateMethod");
assert(response)
verifyPrivate(spy, times(1)).invoke("anotherPrivateMethod", "xyz");
私はあなたのプライベートメソッド(anotherPrivateMethod)が1つの引数「xyz」を取ると仮定しています。プライベートメソッドの宣言に従って変更できます。
プライベートメソッドのテストは、実装の詳細をテストすることです。実装を変更することを選択した場合、テストは価値がなくなり、破棄されます。
どのようにではなく、何をテストするよう努めるべきです。その後、実装を変更してもテストは存続します。
偶発的な詳細のテストを回避する方法についての素晴らしい論文は here にあります。