閱讀79 返回首頁    go 技術社區[雲棲]


Java FP: 偽造閉包工廠,創建域對象

最近我們想構建一個需要使用外部依賴進行計算的域對象,同時我們希望在測試的時候能夠忽略這些依賴。

最開始,我們簡單地在域對象中創建依賴,這使得在測試的過程中,不能隨意修改依賴的值。

同樣,由於外部依賴僅僅隻是域對象的計算所需,並非定義域對象的可變狀態,我們不應該把依賴通過構造函數傳入域對象內部。

最後,我們把域對象定義成內部類,代碼如下:

01 public class FooFactory {
02     private final RandomService randomService;
03  
04     public FooFactory(RandomService randomService) {
05         this.randomService = randomService;
06     }
07  
08     public Foo createFoo(String bar, int baz) {
09         return new Foo(bar, baz);
10     }
11  
12     class Foo {
13         private String bar;
14         private int baz;
15  
16         public Foo(String bar, int baz) {
17             this.bar = bar;
18             this.baz = baz;
19         }
20  
21         public int awesomeStuff() {
22             int random = randomService.random(bar, baz);
23             return random * 3;
24         }
25     }
26 }

測試這段代碼的測試用例如下:

01 public class FooFactoryTest {
02  
03     @Test
04     public void createsAFoo() {
05         RandomService randomService = mock(RandomService.class);
06         when(randomService.random("bar"12)).thenReturn(13);
07         FooFactory.Foo foo = new FooFactory(randomService).createFoo("bar"12);
08         assertThat(foo.awesomeStuff(), equalTo(39));
09     }
10  
11 }

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

參考文獻

Java: Faking a closure with a factory to create a domain object

最後更新:2017-05-23 10:32:12

  上一篇:go  深入理解Java內存模型(四)——volatile
  下一篇:go  AKKA文檔(JAVA版)—派發器