2012-04-18 10 views
0

私は、いくつかのパラメータを必要とする関数をテストしており、その値に基づいて異なるプライベート・メソッドを呼び出します。Javaのスタブ・プライベート・メソッド

この関数が常に適切なプライベートメソッドを呼び出すことを確認したいと思います。

プライベートメソッドが何をするのか分かっているので、最終結果を確認できますが、プライベートメソッドを既にテストしているので、適切な関数が呼び出されたかどうかを直接確認する方が便利です。

privaeメソッドをスタブに置き換える方法はありますか?

+0

メソッドの開始時にコンソールに関数名を表示します。これによって、どの関数が呼び出されるかがわかります。 – vikiiii

+2

これはデバッグしてテストしていないことを確認しています... –

+0

@vikiiii:自動ユニットテストの理想に反していると私は思う。 –

答えて

2

はい、あなたがこれをやらせるモックライブラリがあります行うにはJavaの計器を確認することができます。 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); 

    } 

} 

しかし、私は本当にこのような行為自分に反対する:彼らのprivate method tutorialから、あなたはこのようなものが必要。ユニットテストでは、入力、出力、副作用をテストする必要があります。それだけです。 メソッドが正しく呼び出されるようにすることで、コードが簡単にリファクタリングされないようにするだけです。

言い換えれば、道路を変更したい場合はどうすればいいですかあなたのユニットはその仕事をしていますか?これを実行する安全な方法は、コードがテスト中であることを確認し、コードをリファクタリングし(潜在的にどの内部メソッドが呼び出されるかを変更することを含む)、テストを再度実行して何も破らなかったことを確認することです。あなたのアプローチでは、テストがユニット自体の動作ではなく、正確な実装をテストするため、これは不可能です。リファクタリングはほとんどの場合テストを中断しますので、テストが実際にあなたに与えるメリットはどれくらいですか?

ほとんどの場合、あなたは自分のユニットを実際に自分のものとみなしているので、これをやりたいと思うでしょう。その場合、そのロジックを独自のクラスに抽出してテストし、残りのコードでその新しいユニットのモック/スタブバージョンとやりとりすることが最善です。これを行うと、コードがより構造的になり、PowerMockであるブードゥーの魔法に後戻りする必要はありません。これらのリファクタリングを行うための素晴らしいリファレンスはMichael FeathersのWorking Effectively with Legacy Codeです。

+0

それについてPowerMockで見つけてください。プライベートメソッドをテストするための多くの方法がありますが、私が必要とするものを行う方法はありません。しかし、たぶん私は十分には見えなかったかもしれません。 –

+0

@delamere:リンクはプライベートメソッドを模倣できると言っています。おそらく、それを部分模擬と組み合わせて使用​​したいと思うでしょう。 –

+1

リンク先はhttp://code.google.com/p/powermock/wiki/MockPrivateです。この例(プライベートメソッドを呼び出すパブリックメソッドを持つクラスをテストする)では、クラスを部分的に嘲笑し、プライベートメソッドの期待値を設定します。 –

0

あなたはそう

+0

あなたは何を探すべきですか? –

+0

http://docs.oracle.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html –

+0

一部の模擬フレームワークでもこの機能が使用されています(EasyMockだと思います) –

0

解決策の1つとして、内部クラスから代用することができます。テストする必要があるクラスごとに内部クラスを追加する必要があります。 しかし、それは大きな製品プロジェクトのための非常に良い解決策ではありません。あなたのリリースファイル(jar/war)から生成されたクラスを削除するためのcreateスクリプトを作成する必要があります。

しかし、もっと(:)または上​​)怒鳴るコメントで書いたようにPowerMockを使用することになる簡単な方法 - 別のオブジェクトと問題のクラスを、提供することが可能であろうhttp://code.google.com/p/powermock/wiki/MockPrivate

0

はプライベートメソッドが移動しているために一般公開されましたか?その場合、そのインタフェース用のテストダミーを作成するのは簡単です。

0

右の「プライベートメソッド」を呼び出しても結果が観測できない場合は、これをテストしてもよろしいですか?多分、そうすべきではない。

プライベートメソッドが呼び出されたかどうかにかかわらず、最終結果が同じでも、その呼び出しを監視したい場合は、メソッドをpublicにして、それを自分のクラスに移動し、そのクラスをモックすることができます。次に、あなたのメソッドが呼び出されているかどうかを確認することができます(Mockitoまたは同様のフレームワークを使用して)。

0

コードカバレッジツールは、テストが実際に実行される前にバイトコードを書き直すことによって、この種のことを行います。だから、可能でなければならないが、それは自明ではない。

更新:「正しい」プライベートメソッドをkindと呼ぶ必要がある単体テストを書くと、すべてのテストを書き直さなければならないため、リファクタリングの仕事は本当の苦痛になります。その種のテストの目的を破る。

関連する問題