我有一个工厂类来检索我的应用程序的配置:
public class ConfigurationFactory {
private static ConfigurationFactory configurationFactory = new ConfigurationFactory();
private Configuration configuration = null;
public static ConfigurationFactory getConfigurationFactory() {
return configurationFactory;
}
一些getConfiguration方法取决于我从哪里获取配置(文件,数据库,默认等等):
public Configuration getConfiguration(String path){...}
public Configuration getConfiguration(String database){...}
我的问题是,当我为每个方法进行单元测试时,我必须重新启动单例以便从不同的源加载,所以我唯一想到的就是添加它:
public void resetConfiguration() {
this.configuration = null;
}
而且我觉得我会因为这样做而烧掉开发人员的地狱:)
我的问题:如果不添加此方法,还有其他方法吗?
注意:我看过this并且我不能使用像Spring或Guice这样的任何DI框架,管理层认为添加一个框架会使项目变得更重,因为这个程序打算作为服务器上的守护进程运行。 / p>
答案 0 :(得分:1)
我能想到的一些事情是
使用Easymock
或Mockito
之类的模拟框架来模拟ConfigurationFactory
并在其他调用区域中使用此模拟对象。
在ConfigurationFactory
类中定义一个setter并定义一个类似@TestPurpose
的注释,并使用它来覆盖单元测试中的单例对象。注释是表示在应用程序流程中不应该使用它,该函数仅用于junit目的。
答案 1 :(得分:1)
要解决的第一件事是你的单身人士不应该是静态的。这里有几篇文章向您展示如何做到这一点:
一旦你解决了这个问题,你将不再需要重置你的单身人士,因为你可以随意注射它们。
答案 2 :(得分:0)
如果您不想使用建议的框架,您仍然可以分开' src' test-src'并使用受保护的方法而不是公共方法。这不是理想的,但可以阻止调用该重置方法,同时使您能够进行测试。
- >在你的JUnit-class中使用@After或@AfterClass -methods来调用reset
如果您需要在多个测试场景中使用Factory,您还可以创建一个抽象的BaseTest类,其中包含一个@AfterClass方法来清理这些单例。
此外,您可以通过测试代码中的反射强制执行重置,并且根本不使用额外的重置方法,但我不建议这样做。
答案 3 :(得分:0)
您可以使用反射,例如
public void resetSingleton() throws Exception {
Field instance = FormatterService.class.getDeclaredField("instance");
instance.setAccessible(true);
instance.set(null, null);
}
请参阅an example