2016-07-28 20 views
1

複雑なパラメータユニットテストとメソッド呼び出しを検証するためのベストプラクティスは何ですか?検証んユニットテストメソッドのパラメータ検証のベストプラクティス

A):

class ClassA { 
    ClassB dependency; 

    void someFunction(SomeInputForA input) { 
    // do some thing 
    dependency.anotherFunction(differentInput); 
    } 
} 

私はsomeFunction呼び出し、適切な入力とanotherFunctionであることを確認するためと考えることができる2つのオプション:

は、私はこのような機能をテストだと言いますanotherFunction

unitUnderTest.dependency = mockClassB; 

InputClass expectedDifferentInput = ... ; 

verify(mockClassB).anotherFunction(expectedDifferentInput); 

B)を呼び出すための依存関係のモックにanotherFunctionの呼び出しで引数キャプターを行うとtを主張彼のプロパティ

unitUnderTest.dependency = mockClassB; 

ArgumentCaptor<InputClass> captor = ArgumentCaptor.for(InputClass.class); 

verify(mockClassB).anotherFunction(captor.capture()); 

InputClass capturedInput = captor.getValue(); 
assertEquals(value, capturedInput.param1); 
// and more asserts afterwards 

ここには推奨パスがありますか?それはより厳密に感じられ、オブジェクトが適切である実装に頼っていないので、私はキャプチャメソッドに傾いています。

思考?

+0

値を取得し、メソッドによって作成または管理されている場合は、それらをアサートします。それらが通過した場合、すなわちサービスとして、Aが適切である。 – Compass

答えて

1

はdifferentInputが入力をオフcomputatedですか?

入力Aについて言っているように、あなたのB)が良い方法ですが、ClassAがこれをexpectedDifferentInputに変更し、委任クラス(ClassB)が呼び出されることを確認したいと考えています。 ClassAの入力ロジックと委任ロジックの変換を検証しています。

differentInputは入力とは関係ありませんなら、あなたは本当にあなただけの委任をチェックしているようキャプターを使用する必要はありません。

ClassAのsomeFunctionに対する一般的な呼び出し元は、ClassBについて知る必要はないため、実際にはwhite box testingの両方のメソッドA)とB)があると言えるので、キャプチャを使用することもできます。 someFunctionへの入力を変更すると、取り込み側は、differentInputが入力オフとして計算された場合に、エッジケースを識別するのに役立ちます。

0

は、あなたは、常にmockClassB.anotherFunctionに渡されたオブジェクト()にマッチャーを使用することができます。たとえば、あなたがオブジェクトのフィールドを比較したい場合は、あなたが書くことができます。

Matcher<YourClass> yourMatcher = Matchers.hasProperty("yourProperty", Matchers.equals(whatever)); 
verify(mockClassB).anotherFunction(argThat(yourMatcher)); 

あなたはときとマッチャーのための検証のための構文を共有することができますし、任意の組み合わせを組み合わせることができますので、私は、この方法を好みますマッチャー。これを動作させるには最新のmockitoとhamcrestライブラリを含めるだけです。

0

私は、引数の捕獲者を使用するが、非常に控えめにしました。あなたが直面する最大の問題は、このルートが壊れやすい単体テストを作成することです。クラスに小さな変更を加えた後、影響を受けてはいけないクラスを呼び出す際に単体テストに苦しんでいる人は誰もいません。

これは、間違いなく正しい呼び出しが行われることを確実にする必要があります。しかし、equalsのオーバーライド作業に頼っている場合は、equalsメソッドが動作するクラスに頼っています。これは、そのクラスのコントラクト(およびそのクラスでテストされたユニット)の一部です。

だからこそ私はそれを単純にして、ただ検証することに投票します。最後は同じですが、あなたの単体テストは壊れにくいです。

関連する問題