私はいくつかのパラメーターを取り、それらの値に基づいてさまざまなプライベートメソッドを呼び出す関数をテストしています。
関数が常に正しいプライベートメソッドを呼び出すことを確認したいと思います。
プライベートメソッドが何をするかを知っているので、最終結果を確認できますが、プライベートメソッドをすでにテストしているので、正しい関数が呼び出されたかどうかを直接確認できる方が便利です。
privaeメソッドをスタブに置き換える方法はありますか?
私はいくつかのパラメーターを取り、それらの値に基づいてさまざまなプライベートメソッドを呼び出す関数をテストしています。
関数が常に正しいプライベートメソッドを呼び出すことを確認したいと思います。
プライベートメソッドが何をするかを知っているので、最終結果を確認できますが、プライベートメソッドをすでにテストしているので、正しい関数が呼び出されたかどうかを直接確認できる方が便利です。
privaeメソッドをスタブに置き換える方法はありますか?
はい、これを可能にするモックライブラリがあります。1つはPowerMockです。彼らのプライベートメソッドチュートリアルから、あなたはこのようなものが必要です:
@RunWith(PowerMockRunner.class)
@PrepareForTest(MyUnit.class)
public class TestMyUnit {
@Test
public void testSomething() {
MyUnit unit = PowerMock.createPartialMock(MyUnit.class, "methodNameToStub");
PowerMock.expectPrivate(unit, "methodNameToStub", param1).andReturn(retVal);
EasyMock.replay(unit);
unit.publicMethod(param1);
EasyMock.verify(unit);
}
}
しかし、私自身はこの慣習に本当に同意しません。単体テストでは、入力、出力、および副作用をテストする必要があります。それだけです。プライベートメソッドが正しく呼び出されるようにすることで、コードが簡単にリファクタリングされないようにするだけです。
言い換えれば、将来的にユニットの仕事の仕方を変えたいと思ったらどうしますか?これを行う安全な方法は、コードがテスト中(合格)であることを確認してから、コードをリファクタリングし(呼び出される内部メソッドの変更を含む可能性があります)、テストを再度実行して、何も壊れていないことを確認することです。あなたのアプローチでは、テストはユニット自体の動作ではなく、正確な実装をテストするため、これは不可能です。リファクタリングはほとんどの場合テストを中断しますが、テストは実際にどの程度のメリットをもたらしますか?
ほとんどの場合、これを実行したいのは、実際にそれらのプライベートを自分自身のユニットと見なしているためです(これらのプライベートメソッドを直接テストしていると言っているので、これはあなたのように聞こえます!)。その場合は、そのロジックを独自のクラスに抽出してテストし、残りのコードでその新しいユニットのモック/スタブバージョンと対話するのが最善です。そうすれば、コードの構造が改善され、PowerMockであるブードゥーの魔法に頼る必要がなくなります。これらの種類のリファクタリングを行うための素晴らしいリファレンスは、MichaelFeathersのレガシーコードでの効果的な作業です。
ソリューションの1つとして、内部クラスからのプロキシを使用できます。テストする必要があるすべてのクラス内に内部クラスを追加する必要があります。しかし、それは大きな製品プロジェクトにはあまり良い解決策ではありません。生成されたクラスをリリースファイル(jar / war)から削除するための追加スクリプトを作成する必要があります。
しかし、以下のコメント(または上部:))に書かれているように、より簡単な方法がPowerMockを使用します-http: //code.google.com/p/powermock/wiki/MockPrivate
問題のクラスに、プライベートメソッドが移動されて公開される別のオブジェクトを提供することは可能でしょうか?その場合、そのインターフェイスのテストダミーを作成するのは簡単です。
あなたはそうするためにJavaインストルメンテーションをチェックするかもしれません
適切な「プライベートメソッド」を呼び出しても、外部からの結果が観察されない場合は、これをテストしてもよろしいですか?多分そうすべきではありません。
プライベートメソッドが呼び出されるかどうかに関係なく最終結果が同じであり、その呼び出しを監視したい場合は、メソッドをパブリックにして独自のクラスに移動し、そのクラスをモックすることができます。次に、(Mockitoまたは同様のフレームワークを使用して)メソッドが呼び出されているかどうかを確認できます。
コードカバレッジツールは、テストが実際に実行される前にバイトコードを書き直すことによって、この種のことを行います。だから、それは可能でなければなりませんが、それは自明ではありません。
更新:「正しい」プライベートメソッドを呼び出す必要がある単体テストを作成すると、すべてのテストを書き直さなければならないため、リファクタリングの作業が非常に困難になります。そのようなものは、テストの目的を打ち破ります。