我已经进行了单元测试,当我一一运行它们时,它们通过了。但是,如果我一起运行它们,它们将在第一个失败之后失败。因为在测试中,我正在检查是否已创建文件,并且我的singleton类创建了该文件。但是,如果初始化,它不会创建文件,应该保持这种状态。因此,在不更改单例类代码的情况下,我需要为每个测试重置单例。
我尝试了下面的代码,但不幸的是,它无法正常工作,它无法创建文件。
@Before
public void resetSingleton() throws Exception {
Field instance = MySingleton.class.getDeclaredField("instance");
instance.setAccessible(true);
instance.set(null, null);
}
我的课基本上是这样总结的:
private static MySingleton instance = new MySingleton();
static {
observer = new MyObserver(instance);
}
public static MySingleton getInstance(){
if(instance == null){
instance = new MySingleton();
}
return instance;
修改:
如果单例未运行,则内部有一个方法会写入备份日志,如果正在运行,则假定已执行备份日志。但是这种状态在单元测试之间保持转移。那是我的问题。
答案 0 :(得分:1)
出于这些原因,单单是大多数(不仅是)一种反模式。创建隔离的单元测试要困难得多。特别是如果您在评论中描述了该事实,则表明某个第三方在控制单例是否运行的事实。 如果可能-删除此实现,并确保您的上下文创建一个实例并将其传递给需要它的任何人-作为Java的Spring的IOC容器将使事情变得容易得多。 如果单例一次创建了一个文件,并且这是预期的行为,那么您可以测试仅通过一次测试就可以创建该文件。