4

x()メソッド、y()およびを持つクラス MyClass があるとしましょうz()x()呼び出しy()y()呼び出しとしましょうz()

したがってx()、両方y()をテストしz()て呼び出されるたびに。MyClass の依存関係をモックする場合x()y()と内の依存関係の動作をモックする必要がありz()ます。

したがって、メソッドのテストが である場合、各テスト メソッドで依存関係に対する期待を繰り返す必要がありx()ます。最終的に、内部で何が起こるかを期待するコードがいくつかあり、3 つのテスト メソッドで繰り返されます。これを回避する解決策はありますか?testXWhen1()testXWhen2()testXWhen3()y()z()

x()私のアイデアの 1 つは、実際のメソッドをテストしようとすることでしたが、モックy()z(). その場合、私のインスタンスのMyClass一部はモックであり、一部は本物である必要がありますMyClass。出来ますか?

もう 1 つの解決策は、 での期待について厳密にすることでしたが、でx()何が起こるかについてではなく... の代わりにそれを行うことができると思いますが、それは私のお気に入りの解決策ではありません。y()z()@NonStrict@Mocked

4

3 に答える 3

2

メソッドをテストする場合は、メソッドx()をモックy()する必要があります。その場合、モックする必要はありません。なぜなら、内部のz()呼び出しに決して到達しないためです(y はモックされます)。x、y、および z メソッドを別のテストでテストします。 PowerMock を使用します。メソッドがあります。z()y()createPartialMock

于 2011-12-13T07:43:17.050 に答える
0

コンストラクターで部分的にモックされるクラスまたはオブジェクトを渡すことにより、JMockitの動的な部分的なモックExpectations/NonStrictExpectations機能を使用できます。

ただし、一般的に、部分的なモックの使用は避けるのが最善です。これは、テスト対象のコードにまとまりがないことを示し、テストが理解しにくいためです。

いくつかのテストで同じ期待値が必要な場合は、再利用可能な期待値ブロックを作成するオプションが常にあります。多数の期待値を名前付きの""サブクラスにカプセル化しXyzExpectations、オプションでパラメーター化されたコンストラクターを使用して、任意の数のテストでインスタンス化できます(実際にインスタンス化される "expectations"サブクラスはである必要がありますfinal)。検証ブロックでも同じことができます。

于 2011-12-15T20:44:27.700 に答える
0

最終的に、y() と z() の内部で何が起こるかを期待するコードがいくつかあり、3 つのテスト メソッドで繰り返されます。これを回避する解決策はありますか?

「メソッドの抽出」リファクタリングを試しましたか?

別の解決策は、x() での期待について厳密にすることでしたが、y() と z() で何が起こるかについてではありません...

これはまさに、特定の機能をテストするときに行うことです (JMock を使用していますが)。テストしている動作が依存関係への呼び出しの結果に依存しない場合は、期待を無視/許可する JMock を明示的に使用します。これにより、テストの意図がより明確になり、正確に何がテストされているかに焦点が当てられます。

于 2011-12-13T12:25:25.587 に答える