すべての私のDTOとDOMAINオブジェクトをテストするための抽象クラスのものを書くつもりです。このクラスはテンプレート可能オブジェクト(ジェネリック型)を取り込み、リフレクションを使用してプロパティの型を取得し、特定されたプリミティブ型にいくつかのデフォルト値を割り当て、後でアクセスすることによってこれらの型の値をアサートします。この方法で私のDTOテストがこのクラスを継承するたびに、ほとんどのコードがテストで書かれたコードの1行でテストされます。これは単なるアイデアであり、もし私がこのようなものが既に存在するなら、私が車輪を再発明しているかどうかをあなたからすべて知りたいのですか? DTOとドメインオブジェクトをコードの数が少なく再現性のあるものでテストするより良い方法がある場合。ユニットテストのドメインオブジェクトとドメインオブジェクト
答えて
これは、ドメインオブジェクトのテストには適していないと思います。定義上、これらのオブジェクトはデータと関連する動作をカプセル化し、ゲッターとセッターを持つ単なるデータコンテナ以上のものであると考えられます。手作業でオブジェクトを手書きしたのと同じように、これらのオブジェクトの単位テストを書く必要があります。これは、実際にDDDに従って時間を費やしていると思われる場所です。
DTOについては、questionをご覧ください。
私はDomainオブジェクトテストについて同意します。もう少し小さな質問です。私のDomainオブジェクトのほんの一部が取得/設定されている場合、DTOとしても使用できます。 Webサービスのさまざまなケースで、ドメインオブジェクトをdtoとして使用できますか。 – user1383012
ドメインオブジェクトは、Webサービスコンシューマーをドメインオブジェクトに結合するため、DTOとしてドメインオブジェクトを使用しません。これにより、Webサービスクライアントに影響を与えずにドメインを展開したい場合に問題が発生します。 – Dmitry
私のアドバイス:
がないユニットテストDTOのですか。これらは単純なデータ構造であり、ゲッターとセッターがたくさんあり、動作もありません。ゲッターとセッターは、(DTOではまれなことである種の条件付きロジックをカプセル化しない限り)テストするにはあまりにも愚かです。
ドメインオブジェクトテストを自動化または汎用化しようとしないでください。彼らの行動をテストするコードは、どうやらそれらがすべて定義によって異なる動作をしているので、どのように再利用できるのかわかりません。
私はこのクラスを思い付い@ドミトリーの回答に基づいて、一種の価値のないユニットテストのDTOにあると思いにもかかわらず
:
[TestClass]
public class PeopleTest
{
[TestMethod]
public void OneObjectNull()
{
Person obj1 = null;
var obj2 = new Person
{
Id = "101",
Name = "George Waits",
Address = "Lake Palmer 10"
};
Assert.AreNotEqual(obj1, obj2);
Assert.AreNotEqual(obj2, obj1);
}
[TestMethod]
public void DeepEqual()
{
var obj1 = new Person
{
Id = "101",
Name = "George Waits",
Address = "Lake Palmer 10"
};
var peolpleList1 = new List<Person> { obj1 };
var peolpleList2 = new List<Person> { obj1 };
Assert.AreEqual(obj1, obj1);
CollectionAssert.AreEqual(peolpleList1, peolpleList2);
}
[TestMethod]
public void DeepNotEqual()
{
var obj1 = new Person
{
Id = "101",
Name = "George Waits",
Address = "Lake Palmer 10"
};
var obj2 = new Person
{
Id = "102",
Name = "Rachel Smith",
Address = "Lake Palmer 10"
};
var peolpleList1 = new List<Person> { obj1 };
var peolpleList2 = new List<Person> { obj2 };
Assert.AreNotEqual(peolpleList1, peolpleList2);
var group1 = new KeyValuePair<string, List<Person>>("group1", peolpleList1);
var group2 = new KeyValuePair<string, List<Person>>("group2", peolpleList2);
Assert.AreNotEqual(group1, group2);
}
[TestMethod]
public void PropertyPositive()
{
var obj1 = new Person
{
Id = "101",
Name = "George Waits",
Address = "Lake Palmer 10"
};
obj1.Address = "Parker av 101";
var obj2 = new Person
{
Id = "102",
Name = "Rachel Smith",
Address = "Lake Palmer 10"
};
obj1.Address = "Listener av 45";
Assert.AreNotEqual(obj1, obj2);
}
}
- 1. ドメインオブジェクトへのWCF応答のユニットテスト翻訳
- 2. WCF - ドメインオブジェクトとIExtensibleDataObject
- 3. Spring MVC、ドメインオブジェクトと@JsonIgnore
- 4. ASP.NETのビジネス/ドメインオブジェクト
- 5. ドメインオブジェクト - "スマートオブジェクト" vs POCO
- 6. 貧血ドメインオブジェクト?
- 7. ドメインオブジェクトのセッションへのアクセス
- 8. アプリケーション設計 - ドメインオブジェクトの更新
- 9. JSONとネストされたGrailsドメインオブジェクトのバインド
- 10. ドメインオブジェクトをGUIにバインドする
- 11. リポジトリ、エンティティオブジェクト、およびドメインオブジェクト
- 12. ドメインオブジェクトはJPAエンティティと同じですか?
- 13. ドメインオブジェクトごとにアクターを作成する
- 14. ドメインオブジェクトのベストプラクティスのリストを返します
- 15. Hibernateでのドメインオブジェクトの命名規則
- 16. Grailsのxmlをドメインオブジェクトに変換する
- 17. ADO.NET SQLDataReaderからドメインオブジェクトへのマッピング?
- 18. ドメインオブジェクトの振る舞い方法
- 19. ドメインオブジェクト内のセットを注文する
- 20. Spring SessionFactory作成ドメインオブジェクト自動スキャン
- 21. ドメインオブジェクトにMongoRepositoryを注入する
- 22. Grailsは子ドメインオブジェクトを取得します
- 23. ドメインドリブンデザイン、ドメインオブジェクト、セッターに関する態勢
- 24. Grails 3 @Delegate表記(ドメインオブジェクトを使用)
- 25. デザイン:ドメインオブジェクトとサービスオブジェクトの間の線が明確でないとき
- 26. Grails - あるドメインオブジェクトから別のドメインオブジェクトに複数の関係がコピーされていますか?
- 27. 複数のデータマッパーを必要とするドメインオブジェクト
- 28. o.errors.allErrors.each {println it}ドメインオブジェクトの保存に失敗するとデフォルトで
- 29. マッピングLINQのエンティティとドメインオブジェクトと私は今、私のドメインオブジェクトを保存するときに変更を追跡することができませんLINQのエンティティに私のドメインオブジェクトをマップする場合
- 30. 2つのドメインオブジェクト間の複数の関係
私が正しくあなたを理解している場合、あなたがマッピングかどうかをテストしてみてくださいdomainobjectとdtoが完了した、つまり属性の欠落/消失はありません。質問にプログラミング言語を追加すると、すでに解決策が存在する可能性があります。あなたが多くのdtos(> 20)を持っているならば、私の経験から。あなたのtestapiは、変換から除外されるプロパティと、異なるかもしれないコレクションの順序を考慮する必要があります – k3b
データ構造ではなく動作をテストする必要があります。DTOはデータ構造です。ちょうど何らかの動作で状態を変更する集計メソッドをテストする必要がありますもし、あなたがそれらをテストする必要があると感じたら、それらを生成するためにプロジェクトlombokのようなライブラリを使うことをお勧めします。 – rascio