[java] 求助

2016-09-20 11:18:57 +08:00
 andrewzhou

class A{ private M m = SomeObjectGetfromSingleton; }

另外一种写法 class A{ private M m ; public A() { m= SomeObjectGetfromSingleton; } }

1 )现在代码中是用的第一种写法,测试的时候因为这种方式的存在不知道怎么 Mock m 。 2 )上面两种写法等效吗?

2871 次点击
所在节点    Java
7 条回复
chocotan
2016-09-20 11:32:53 +08:00
为啥会不知道怎么 Mock m ?
两种无非是初始化顺序不同
andrewzhou
2016-09-20 13:49:57 +08:00
@chocotan m 是一个私有的从单例 (单例使用 enum 实现的)中拿到的对象, 现在我还没弄明白怎么 Mock , 1 ) Mock 单例 2 ) Mock m 但是现有代码是第一种写法不知道怎么 Mock A 是被测试类,需要部分 Mock 。
chocotan
2016-09-20 16:14:40 +08:00
m = Mockito.spy(m);
Mockito.doReturn(xxx).when(m).someMethod(anyParam);
frienmo
2016-09-20 17:16:30 +08:00
知识有限,尝试回答第二个
不等效。
第一个等效于 M m; { m = GetXXX} 是 initialization block
所以和第二个在构造类中的执行顺序有区别。
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 框架,也可以利用这样的构造器做注入。
georgema1982
2016-09-21 04:33:41 +08:00
两种写法都不利于单元测试,最好的是用 constructor injection 的方式把 m 注入进来
andrewzhou
2016-09-21 08:58:31 +08:00
感谢 各位 但是我对 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();这种

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/307460

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX