比较DTO是否等于Java中的域模型

比较DTO是否等于Java中的域模型,java,unit-testing,test-refactoring,Java,Unit Testing,Test Refactoring,我已经开始尝试让我的单元测试尽可能干净,我遇到了:我如何能够以干净的方式比较DTO和域模型(DM),它们包含10个以上的属性,并共享其中一些属性,但不是全部 细节:可以有共享属性,但类型或名称不同,因此在这种情况下不能使用反射 例如: class Person { private String id; private String name; private String lastName; private Date dateOfbirth; } c

我已经开始尝试让我的单元测试尽可能干净,我遇到了:我如何能够以干净的方式比较DTO和域模型(DM),它们包含10个以上的属性,并共享其中一些属性,但不是全部

细节:可以有共享属性,但类型或名称不同,因此在这种情况下不能使用反射

例如:

class Person {
     private String id;
     private String name;
     private String lastName;
     private Date   dateOfbirth;
}

class PersonDto{
     private String id;
     private String name;
     private String lastName;
     private int    dateOfBirth;
}
DTO不应该持有任何类型的复杂逻辑,因为它只是在客户机-控制器-服务之间传输数据

DM将在服务存储库层之间持久化并提供信息。但它不应该有任何类型的复杂逻辑(到目前为止是equals和hashcode)


然后我在想。。。我是否应该创建一个
TestHelperComparator
来执行此操作?还是在DTO或DM中实现一种相互比较的方法?或者这种情况下的最佳实践是什么?

您的代码中可能有DTO到域的映射逻辑,例如
PersonToDtoMapper
类。确保映射逻辑封装在单独的类中。然后,您可以在单元测试中重用这个映射器类,在需要比较时从一种格式转换为另一种格式


只要在自己的测试中测试了
PersonToDtoMapper
,在其他测试中重用它应该不会有问题,如果
PersonToDtoMapper测试失败,错误将很容易被发现。

DTO和域对象不应该相互了解,或者会引入奇怪的依赖关系。我知道的可能重复,这就是为什么我认为在它们里面有一个比较它们的方法不是一个好主意,创建DTO和DM的方法总是通过映射器。没有@stevecross是重复的,我基本上不能使用反射,因为有些属性有不同的类型或名称。只有当它们的名称和类型完全相同时,才能使用反射。另外,当您使用任何类型的库作为ModelMapper或其他时。谢谢您的回答。情况是,我有我的映射器,但我想要的是在我的测试中,我想检查发送的DM是否与接收的DTO相似。如果断言在许多测试类中重复,那么将其提取到一个类中是有意义的。如果它只是一个测试类,那么逻辑可以保存在一个util方法中。不要在测试中重复你自己很重要,但更重要的是测试的可读性。我明白了。。。这实际上是我想确定的,我不想弄乱类,但同时我也不想为此创建一个util类,但我能理解这是最好的方法,因为我将不得不在另一个测试中使用它。@dbenor还检查像MapStruct这样的工具,它们可以在编译时为您生成映射器。@chrylis,我在考虑这个问题,不幸的是,这个问题来自我公司的一个项目,我告诉他们迁移到MapStruct,实际上我看到它的性能比其他的好,但他们的回答显然是否定的。。。不过还是谢谢你