1

最近、私は契約テストと共同テストに関する多くの記事(主にJB Rainsbergerから)を読んでいます。それを取り入れるために、私は小さなプロジェクトを始めました。

私の理解では、コントラクトテストの責任は、実装がそのインターフェイス固有のコントラクトを尊重していることを確認することです。言い換えれば、それはリスコフの置換原則を奨励します。

オブジェクトの共同作業者を嘲笑することは、基本的に、それについての仮定を立てることです。さて、これらの仮定が変わるとどうなりますか?このようにMockitoを使用してコラボレーターをモックすると(スタブと同じことになります):

 when(collaborator.doSomething(someArgument)).thenReturn(someValue);

コラボレーターのインターフェース(つまり、そのコントラクト)を変更すると、変更に気付くことができなくなります。

だからここに私の質問があります:テスト対象のシステムに間接的な入力を提供する共同作業者を偽造するとき、見過ごされているインターフェース/契約の変更を防ぐためにスタブを使用する必要があるのは正しいですか?

これが私がすでにチェックしたいくつかのリンクです:

統合テスト詐欺の理解、コラボレーションと契約の削除

Javaでのコントラクトテストの記述方法

私は十分に明確であることを願っていますが、そうでない場合は、これをより透明にするために最善を尽くします。よろしくお願いします。

4

2 に答える 2

0

スタブとモックの間には明確な分離があります。

スタブは代用であり、テストの結果を変更することはできません。たとえば、サブジェクトに渡される入力パラメーター。

一方、モックはテストに失敗する可能性があります。これは、オブジェクト間のコラボレーションをテストするための基礎です。期待されるコラボレーションが満たされない場合、テストは失敗するはずです。

したがって、あなたの質問の文脈では、システムへの間接的な入力はスタブでなければなりません。

于 2012-12-04T12:48:02.297 に答える
0

JB Rainsbergerには、あなたの質問に正確に答えているように見える記事があります。誰が契約テストをテストしますか?

だからここに私の質問があります:テスト対象のシステムに間接的な入力を提供する共同作業者を偽造するとき、見過ごされているインターフェース/契約の変更を防ぐためにスタブを使用する必要があるのは正しいですか?

何ではなくスタブを使用しますか?

モック?@bryanbcookが指摘しているように、それは大きな違いにはならず、とにかくそのような状況ではスタブがより適切です。

コラボレーターと同じ基本クラスを実装していない手動の偽のクラス?もちろん。

IMOには2種類の契約変更があります:

  • 「ハード」な変更、つまり、共同作業者のメソッドの戻りタイプまたはパラメータータイプの変更。これらの変更は簡単です。偽のコラボレーターが実際のコラボレーターと同じインターフェイス/基本クラスを実装していれば、テストはコンパイルされなくなるため、見過ごされることはありません。

  • 「ソフト」な変更、つまり、コラボレーターが特定の値を返す条件の変更、スローされる可能性のある例外を除いて、コラボレーターが返すまたは受け入れることができる値の範囲の変更など。これらを見つけるのはより困難です。ただし、前述の記事によると、コントラクトテストとコラボレーションテストを厳密に対応させることで回避できます。

于 2012-12-04T14:26:12.790 に答える