1. 程式人生 > >Java FP: 偽造閉包工廠,建立域物件

Java FP: 偽造閉包工廠,建立域物件

原文連結 作者:  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));
    }

}

程式碼看似冗餘,卻合理地解決了測試與外部依賴的解耦問題。

參考文獻