模拟框架通常不鼓励模拟数据对象。
但是每次在测试中需要它时填充数据对象可能很不方便。
一种常见的方法是使用测试生成器。就像是:
public class MyDtoBuilder {
private Foo foo;
private Bar bar;
public static MyDtoBuilder aMyDto() {
return new MyDtoBuilder();
}
public MyDtoBuilder withFoo(Foo foo) {
this.foo = foo;
return this;
}
public MyDtoBuilder withBar(Bar bar) {
this.bar = bar;
return this;
}
public MyDtoBuilder withDefaults() {
return this.withFoo(new Foo(...)).withBar(new Bar(...));
}
public MyDto build() {
return new MyDto(foo,bar);
}
}
现在您可以方便地使用默认值构建 DTO,然后根据需要覆盖它们。如果Foo
并且Bar
很复杂,您也可以为这些测试构建器,因此您可以执行类似的操作
MyDto expectedDto = aMyDto()
.withDefaults()
.withFoo(aFoo()
.withName("testFoo"))
.build();
这在Freeman 和 Pryce的《 Growing Object-Oriented Software》一书中详细介绍了测试指导。
您应该注意区分测试构建器和用于非测试代码的构建器(这是实例化不可变对象的常见模式)。不要跨越这些流——不要在非测试代码中使用您的测试构建器。