class A{ private M m = SomeObjectGetfromSingleton; }
另外一种写法 class A{ private M m ; public A() { m= SomeObjectGetfromSingleton; } }
1 )现在代码中是用的第一种写法,测试的时候因为这种方式的存在不知道怎么 Mock m 。 2 )上面两种写法等效吗?
1
chocotan 2016-09-20 11:32:53 +08:00
为啥会不知道怎么 Mock m ?
两种无非是初始化顺序不同 |
2
andrewzhou OP @chocotan m 是一个私有的从单例 (单例使用 enum 实现的)中拿到的对象, 现在我还没弄明白怎么 Mock , 1 ) Mock 单例 2 ) Mock m 但是现有代码是第一种写法不知道怎么 Mock A 是被测试类,需要部分 Mock 。
|
3
chocotan 2016-09-20 16:14:40 +08:00
m = Mockito.spy(m);
Mockito.doReturn(xxx).when(m).someMethod(anyParam); |
4
frienmo 2016-09-20 17:16:30 +08:00
知识有限,尝试回答第二个
不等效。 第一个等效于 M m; { m = GetXXX} 是 initialization block 所以和第二个在构造类中的执行顺序有区别。 |
5
dreamworldcn 2016-09-20 22:25:46 +08:00
抛砖引玉,目前的解决思路是额外增加一个构造器用于单元测试。
比如 public class A { private IService service; public A() { this.service = getServiceFromSingleton(); } public A(IService s) { //用于单元测试的构造器 this.service = s; } } 这样单元测试的时候,使用用于单元测试的构造器,就可以给类 A 提供 mock 的 IService 。 以后引入 DI 框架,也可以利用这样的构造器做注入。 |
6
georgema1982 2016-09-21 04:33:41 +08:00
两种写法都不利于单元测试,最好的是用 constructor injection 的方式把 m 注入进来
|
7
andrewzhou OP 感谢 各位 但是我对 java 不熟
想在的代码是 class A{ private M m = SomeObjectGetfromSingleton; } 如果代码改变为 class A{ private M m; public A(){m = SomeObjectGetfromSingleton();} public A(M x){ m= x; } } 不确认正常非测试的时候调用是不是有细微的差别 A a = new A();这种 |