私はすでに定義された別の方法の特殊化と見なすことができる方法に取り組んでいます。ここで説明するサンプルコードです:既にテスト済みの別のメソッドに依存するメソッドをテストするにはどうすればよいですか?
public class ProductService {
public void addProduct(Product product) {
//do something
}
public void addSpecialProduct(Product product) {
addProduct(product);
//do something after
}
}
私はすでにかなり複雑でaddProduct
のため、私が持っているテストをコピーする必要はありません。私が望むのは、私がaddSpecialProduct
のテストを定義するときです。私はプロセス内でaddProduct
も呼び出していることを確認しています。これが2つのクラスのコラボレーションの問題だった場合、コラボレーターを嘲笑させ、ターゲットメソッドが呼び出されたことを確認して(必要に応じてスタブする)ことは簡単です。ただし、2つのメソッドは同じクラスに属します。しかし、私はこのアプローチは何とかユニットテストの目的に反しか思ったんだけど
public void testAddSpecialProduct() {
//set up code
ProductService service = spy(new DefaultProductService());
service.addSpecialProduct(specialProduct);
verify(service).addProduct(specialProduct);
//more tests
}
:
は、私が今考えていることは、私がテストしてるオブジェクトのようなものをスパイすることです。この問題に関する一般的なコンセンサスは何ですか?
あなたは、テストユーティリティメソッドで 'addProduct'方法のためにあなたのアサーションを入れて、複数のテストケースの間であることを再利用してもらえますか? – chrylis
このクラスはビットコードの臭いが私には聞こえるので、これらの2つの機能(製品と特別な製品)を2つの別々のクラスに構成することをお勧めします。一般的な「追加」と「特殊な追加」は単一の責任を負います。 – kuhajeyan
@chrylis実際には妥当と聞こえる、はい。以前は似たようなことをしたことを忘れてしまった。 –