Vad*_*huk 5 java unit-testing domain-driven-design mocking mockito
这是来自Mockito单元测试框架的报价:
不要嘲笑值对象
为什么一个人甚至想要这样做?
因为实例化对象太痛苦了!=>无效的原因。如果创建新装置太困难,则表明该代码可能需要进行认真的重构。一种替代方法是为您的值对象创建构建器-有一些用于实现此目的的工具,包括IDE插件,Lombok等。也可以在测试类路径中创建有意义的工厂方法。
还有另一个引用来自这里:
为简单的值对象(无论如何应该是不变的)编写模拟并没有多大意义,只需创建一个实例并使用它即可。创建一个接口/实现对来控制返回哪个时间值是不值得的,只需创建具有适当值的实例并使用它们即可。当类不值得嘲笑时,有两种启发式方法。首先,它只具有访问器或简单的方法来对它所拥有的值起作用,它没有任何有趣的行为。其次,除了VideoImpl或类似的模糊术语之外,您无法想到该类的有意义的名称。
这似乎是愚蠢的值对象仅包含值而仅包含值的正当理由,但是当您有一个ValueObject引用实体和其他值对象时,事情变得更加复杂。
假设我有Person和Pet对象,它们是实体和Relationship(所有者,医生等),是两个人之间的ValueObject,并且RelationshipType也是Value Object。因此,关系基本上是:
class Relationship {
private Person person;
private Pet pet;
private RelationshipType type;
}
Run Code Online (Sandbox Code Playgroud)
现在,假设我有一个谓词类似isOwnerRelationship,isDoctorRelationship的类。基本上谓词很简单
关系-> Relationship.isOwner(); //委托给RelationshipType.isOwner()
现在,我要测试谓词,我有两个选择:
模拟关系
public void testIsOwner() {
Relationship rel = mock(Relationship.class);
when(rel.isOwner()).thenReturn(true);
assertTrue(RelationshipPredicates.isOwner(rel));
}
Run Code Online (Sandbox Code Playgroud)
不要嘲笑关系
public void testIsOwner() {
Person person = PersonBuilder.newPerson();
Pet pet = PetBuilder.newDogPet();
RelationshipType type = RelationshipTypes.ownerType();
Relationship rel = new Relationship(person, pet, type);
assertTrue(RelationshipPredicates.isOwner(rel));
}
Run Code Online (Sandbox Code Playgroud)
当然,该示例过于简化,因为对于一个人,您可能需要提供地址,对于Pet,您可能必须提供BreedType,无论如何,即您可能需要提供的实体和值对象的传递图可能非常庞大。当然,您可以模拟实体,但前提是在关系中您有更多的ValueObjects ValueObjects。即使您有一些精巧的生成器,您也必须提供原始ValueObject的每个部分,即使单元测试仅测试其单个方面。
在谓词测试中,如果谓词在乎调用对象的一种特定方法或它们的组合,那我为什么还要在意完整的对象构造?
还是这样的价值对象不能被视为简单且规则不适用?
单元测试应该测试各个单元。所以,如果你的ValueObject足够简单,那么它不应该影响SUT(被测对象)的测试。但是,如果ValueObject具有复杂的行为,那么您应该嘲笑它。这简化了测试并仅对 SUT 进行隔离测试。
| 归档时间: |
|
| 查看次数: |
1100 次 |
| 最近记录: |