79
技術社區[雲棲]
Java FP: 偽造閉包工廠,創建域對象
最近我們想構建一個需要使用外部依賴進行計算的域對象,同時我們希望在測試的時候能夠忽略這些依賴。
最開始,我們簡單地在域對象中創建依賴,這使得在測試的過程中,不能隨意修改依賴的值。
同樣,由於外部依賴僅僅隻是域對象的計算所需,並非定義域對象的可變狀態,我們不應該把依賴通過構造函數傳入域對象內部。
最後,我們把域對象定義成內部類,代碼如下:
01 |
public class FooFactory {
|
02 |
private final RandomService randomService;
|
04 |
public FooFactory(RandomService randomService) {
|
05 |
this .randomService = randomService;
|
08 |
public Foo createFoo(String bar, int baz) {
|
09 |
return new Foo(bar, baz);
|
16 |
public Foo(String bar, int baz) {
|
21 |
public int awesomeStuff() {
|
22 |
int random = randomService.random(bar, baz);
|
測試這段代碼的測試用例如下:
01 |
public class FooFactoryTest {
|
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 ));
|
代碼看似冗餘,卻合理地解決了測試與外部依賴的解耦問題。
參考文獻
Java: Faking a closure with a factory to create a domain object
最後更新:2017-05-23 10:32:12