package singleton;
public class SingltonCls {
private SingltonCls() {
}
private static class innerCls {
private static SingltonCls INSTANCE = new SingltonCls();
}
public static SingltonCls getInstance() {
return innerCls.INSTANCE;
}
public int getValue() {
return 12;
}
}
测试类是
package singleton;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class UnitTest {
@Test
public void testAdd() {
assertEquals(SingltonCls.getInstance().getValue(),12);
}
}
在这里,我可以毫无问题地测试我的Singleton类。任何机构都有Singleton影响单元测试的实时场景吗?
答案 0 :(得分:1)
问题不在于Singleton本身,而是在经常访问Singleton的方式 - 使用静态调用MySingleton.getInstance()
。这样的调用不能用模拟实例轻易替换。
测试Singleton没有问题:
能够在测试期间交换模拟的生产实现很重要,因为它使您能够真正执行单元测试(即独立于其他组件测试组件),并允许您进行测试您的组件,即使所有依赖项都无法在测试环境中完全复制(想想一个Singleton,当您不希望测试向您的客户发送电子邮件时发送电子邮件;或者一个访问数据库的单例,您不能安装在测试环境中。)
答案 1 :(得分:0)
如果您的单例包含无法在测试之间重置的可变状态,那么它将影响单元测试,因为测试需要按特定顺序运行并且状态占用。
如果您的单身人员包含时间变化的状态,则会阻止您可靠地并行运行测试。
对于单身人士运行测试,你有两种选择,而不会让你的生活变得艰难: