最近,我們想要創建一個域對象,該對象需要具有外部依賴關系才能進行計算,并且希望能夠在測試中解決該依賴關系。
最初,我們只是在領域類中新建依賴項,但這使得無法在測試中控制其值。
同樣,我們似乎不應該將這種依賴關系傳遞到域對象的構造函數中,因為它不是定義對象的狀態,而只是定義對象使用的狀態。
我們最終得到了類似于以下代碼的內容,其中將域對象作為內部類:
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