Singleton如何影响单元测试

时间:2015-11-17 14:26:02

标签: java unit-testing

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影响单元测试的实时场景吗?

2 个答案:

答案 0 :(得分:1)

问题不在于Singleton本身,而是在经常访问Singleton的方式 - 使用静态调用MySingleton.getInstance()。这样的调用不能用模拟实例轻易替换。

测试Singleton没有问题:

  • 实现了一个定义良好的接口,
  • 仅用于该界面,
  • 以允许注入所述接口的不同实现的方式获得。

能够在测试期间交换模拟的生产实现很重要,因为它使您能够真正执行单元测试(即独立于其他组件测试组件),并允许您进行测试您的组件,即使所有依赖项都无法在测试环境中完全复制(想想一个Singleton,当您不希望测试向您的客户发送电子邮件时发送电子邮件;或者一个访问数据库的单例,您不能安装在测试环境中。)

答案 1 :(得分:0)

如果您的单例包含无法在测试之间重置的可变状态,那么它将影响单元测试,因为测试需要按特定顺序运行并且状态占用。

如果您的单身人员包含时间变化的状态,则会阻止您可靠地并行运行测试。

对于单身人士运行测试,你有两种选择,而不会让你的生活变得艰难:

  1. 不允许它有任何可变状态。
  2. 不要使用单身人士。