5

次のようなメソッドがあるとします。

public static String[] parseFoo(Foo anObject){
    Foo anotherObject = parseFoo2(anObject);
...
}

private static Foo parseFoo2(Foo anObject){
...
}

両方のメソッドが同じクラスにあります。parseFoo2 は、 parseFoo が何かを成し遂げるのを助ける単なるヘルパーメソッドです。メソッドparseFooをテストしようとしています。オブジェクトのインスタンスメソッド呼び出しを指定できる方法のように、parseFoo2 のプライベートメソッド呼び出しで戻り値を指定できる EasyMock の誰かがいますか?

EasyMock.createMock(...);
anObject.expect(...).andReturn(...);

public メソッドをテストしたいのですが、private メソッドに入って内部の実装をテストする必要はありません。

ありがとう

4

3 に答える 3

13

やらないでください。優れた単体テストの要の 1 つは、実装の詳細にできるだけ依存しないようにすることです。プライベートメソッドをモックアウトすることはまさにそれです。

なんで?それはあなたの単体テストを非常に脆弱にするからです。1 週間後にこのコードに戻って、メソッド parseFoo2 は実際には必要なく、実際にはそのコードをインライン化する必要があると判断した状況を考えてみてください。または、このメソッドを 2 つ以上の小さなメソッドに分割する場合。すべての非常に有効なリファクタリング プラクティス -しかし、それらは単体テストに違反します!

そのような単純なリファクタリングを行うたびに単体テストを追跡する必要はありません。したがって、プライベート メソッドをモックすることは悪い習慣と見なされます。

于 2012-08-06T18:50:21.427 に答える
9

プライベート メソッドをモック アウトする必要がある場合は、 を使用できますPowerMock.expectPrivate()。EasyMock はプライベート メソッドをモックできません。

于 2012-08-06T18:54:26.693 に答える
0

それでも EasyMock を使用したい場合は、それを変更することはあなた (企業で働いている) に依存しないため、リフレクションを使用して、メソッドが返すプライベート フィールド、またはそのプライベート フィールドを変更できます。

たとえば、これらのメソッドをヘルパー クラスに含めることができます。そして、必要に応じてそれらを使用してください。

于 2013-01-16T11:17:46.153 に答える