最近,我们想要创建一个域对象,该对象需要具有外部依赖关系才能进行计算,并且希望能够在测试中解决该依赖关系。
最初,我们只是在领域类中新建依赖项,但这使得无法在测试中控制其值。
同样,我们似乎不应该将这种依赖关系传递到域对象的构造函数中,因为它不是定义对象的状态,而只是定义对象使用的状态。
我们最终得到了类似于以下代码的内容,其中将域对象作为内部类:
public class FooFactory {private final RandomService randomService;public FooFactory(RandomService randomService) {this.randomService = randomService;}public Foo createFoo(String bar, int baz) {return new Foo(bar, baz);}class Foo {private String bar;private int baz;public Foo(String bar, int baz) {this.bar = bar;this.baz = baz;}public int awesomeStuff() {int random = randomService.random(bar, baz);return random * 3;}}
}
然后,对该代码的测试可能如下所示:
public class FooFactoryTest {@Testpublic void createsAFoo() {RandomService randomService = mock(RandomService.class);when(randomService.random("bar", 12)).thenReturn(13);FooFactory.Foo foo = new FooFactory(randomService).createFoo("bar", 12);assertThat(foo.awesomeStuff(), equalTo(39));}
}
解决该问题的方法有点冗长,但似乎工作得很好。
参考: Java:伪造工厂的闭包以从我们的JCG合作伙伴 创建域对象 Mark Needham博客上的 Markh Needham。
翻译自: https://www.javacodegeeks.com/2012/03/java-faking-closure-with-factory-to.html