Java FP: 偽造閉包工廠,建立域物件
阿新 • • 發佈:2018-12-22
原文連結 作者: Mark Needham 譯者: 李璟([email protected])
最近我們想構建一個需要使用外部依賴進行計算的域物件,同時我們希望在測試的時候能夠忽略這些依賴。
最開始,我們簡單地在域物件中建立依賴,這使得在測試的過程中,不能隨意修改依賴的值。
同樣,由於外部依賴僅僅只是域物件的計算所需,並非定義域物件的可變狀態,我們不應該把依賴通過建構函式傳入域物件內部。
最後,我們把域物件定義成內部類,程式碼如下:
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 { @Test public 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)); } }
程式碼看似冗餘,卻合理地解決了測試與外部依賴的解耦問題。