通常我们会看到的单例模式
public class AI {
private static X instance = null;
private AI() {}
public static AI instance() {
if (instance == null)
instance = new AI();
return instance;
}
// more methods...
}
这里我们先放过它饿不饿已经同不同步的问题。。。狠抓它对于单元测试的破坏。。。
显然我们在单元测试中是不喜欢单例模式的, 因为我们没法mock出一个单例对象。因为单例中的实例是私有的, 所以为了单元测试, 我们或许可以这么干:
public class AI {
static AI instance = null;
private AI () {}
public static AI instance() {
if (instance == null)
instance = new AI ();
return instance;
}
// methods.
}
class TestAI {
@Before
public setup() {
AI.instance = new AIMock();
}
}
class AIMock extends AI{
// overide methods
}
我们做了哪些改动?
很简单, 把instance改成了包可见, 这样既不会影响代码的封装性, 也满足了测试的需求。 Sounds good~.
网友评论