web-dev-qa-db-ja.com

単体テストでモックを使用するか、オブジェクトの新しいインスタンスを作成する必要がありますか?

次のようなメソッドの単体テストを作成する必要があります。

void doSomethingWith(Country country) {...}

次のクラスがあります。

インターフェース:

public interface Country {
  String getName();
  ... // and a lot of other methods, more than 20
}

インターフェースを実装するクラス:

public class CountryInst implements Country {
  ...
}

私のテストでは、次のオプションから選択します。

1)モックをパラメーターとして渡します:

Country country = Mockito.mock(Country.class);
Mockito.doReturn("Canada").when(country).getName();
doSomethingWith(country);

2)または、CountryInstの新しいインスタンスを作成し、必要なメソッドをオーバーライドします。

Country country = new CountryInst {
  @Override
  String getName() {
    return "Canada";
  }
}
doSomethingWith(country);

どちらが望ましいですか?

1
Ales

これは、doSomethingWithCountryのすべてのフィールドを使用するかどうかに大きく依存します。はいの場合、2つのアプローチは同等であり、どちらがより読みやすいかを判断するのはあなた次第です。それ以外の場合は、相互作用するメソッドのみをスタブ化し、関連性のないメソッドを除外するモックオブジェクトを作成する方がはるかにクリーンです。これにより、指定された/いつ/その後のパーツを明確に記載することで、テスト対象を理解しやすくなります。

3
kryger