web-dev-qa-db-ja.com

単体テスト/新しく作成されたオブジェクトのプライベートフィールドを検証する方法

このコードを含む基本的な単体テスト(サンプル)があります。

_void testShouldCreateACar() {
  Car car = someone.createFerrari();
  assertTrue(car.name == "Ferrari"); // can't access name since name is private
}
_

name(またはCar)クラスにゲッターがないため、Ferrariにアクセスできません。
単体テストの目的でのみゲッターを作成したくありません。

SUTが車のパッケージ(個別パッケージ)に含まれていないことに注意してください。
Ferrariのコンストラクターはprivateでもあることに注意してください(someonecreateFerrari()メソッドを介してのみアクセスできます)。

この主張を達成するための良い習慣は何ですか?

3
Mik378

車の名前がまったく公開されていない場合は、クライアントコードには関係ないので、テストしても意味がありません。車の名前が重要な場合は、フィールドを調べても実際には表示されない場合でも、名前が正しいことに依存しているいくつかのメソッドを実行し、そこからの目に見える結果に対して断定します。

以下の明確なコメントを編集します。ORMがプライベートフィールドを重視する場合、統合テストを介して間接的にテストする方がはるかに有益だと思います。私はおそらく、すべてのクラスのすべてのフィールドに対して特定のテストを書くことはできませんが、私には細かすぎるようです。永続化がまったく機能する必要のあるいくつかの統合テストを作成することをお勧めします。暗黙的にリフレクションがチェックされます。

8
sara

フィールドのスコープを変更します。

名前が重要でその動作をテストする必要がある場合は、そのフィールドをpublicにします。この場合は、public read only。次に、コンストラクターが起動された後にオブジェクトの状態をテストできます。

0
Jon Raynor