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

相关文章
C4.
|
1月前
|
缓存 Java
Java的Integer对象
Java的Integer对象
C4.
11 0
|
1月前
|
Java
【Java每日一题】— —第二十三题:匿名对象及其使用问题
【Java每日一题】— —第二十三题:匿名对象及其使用问题
16 0
|
20天前
|
Java
java8中List对象转另一个List对象
java8中List对象转另一个List对象
36 0
|
1月前
|
Java
【Java】— —实现人物对象的增、删、改、查(注:对象的删除以逻辑删除为主,在person类中设置“删除状态字段”,字删除该字段时,将状态改为有效。)
【Java】— —实现人物对象的增、删、改、查(注:对象的删除以逻辑删除为主,在person类中设置“删除状态字段”,字删除该字段时,将状态改为有效。)
33 0
|
6天前
|
存储 Java 编译器
对象的交响曲:深入理解Java面向对象的绝妙之处
对象的交响曲:深入理解Java面向对象的绝妙之处
35 0
对象的交响曲:深入理解Java面向对象的绝妙之处
|
11天前
|
Java
在Java中,多态性允许不同类的对象对同一消息做出响应
【4月更文挑战第7天】在Java中,多态性允许不同类的对象对同一消息做出响应
17 2
|
20天前
|
Java
Java常用封装Base对象
Java常用封装Base对象
8 0
|
27天前
|
Java
【Java】通过Comparator比较器的方式给对象数组排序
【Java】通过Comparator比较器的方式给对象数组排序
8 0
|
27天前
|
Java
【Java】重写compareTo()方法给对象数组排序
【Java】重写compareTo()方法给对象数组排序
10 0
|
1月前
|
Java 数据安全/隐私保护
JAVA对象
JAVA对象
10 0