加载静态属性文件类

时间:2014-03-26 20:28:09

标签: java unit-testing properties dependency-injection

目前我正在使用单例类来读取和加载有属性文件。我在任何想要使用属性值的类中得到了这个实例。

使用静态类而不是可以加载一次(当服务器启动时或某些东西......)而不是使用单例时,这不是更好吗?为什么不呢?

此外,我们如何加载静态类OnServerStart或部署war时。

PS:项目是网络应用程序

1 个答案:

答案 0 :(得分:1)

Singleton对于依赖注入和单元测试比静态更好。

您可以将singleton类的实例或该类型的Mock注入任何其他被测试的类。

public class PropertiesHolder {
   private static final PropertiesHolder INSTANCE = new PropertiesHolder();

   private final Properties props;

   private PropertiesHolder() {
       props = load();
   }

   public static PropertiesHolder getInstance() {
       return INSTANCE;
   }

   public String getProperty(String key) {
       return props.getProperty(key);
   }

   private Properties load() {
      ...
   }
} 

然后你可以在测试中模拟PropertiesHolder:

@RunWith(MockitoJUnitRunner.class)
public class MyTest { 

   @Mock private PropertiesHolder holder;

   @Test
   public void testSomething() {
      SomeService service = new SomeService(holder);

      when(holder.getProperty("foo")).thenReturn("bar");

      String result = service.doSomething(); 

      assertEquals(...)
   }

}

对于生产代码,您可以使用:

new SomeService(PropertiesHolder.getInstance()); 

甚至更好,使用DI框架,例如春天,用于布线豆类。 PropertiesHolder将是一个具有工厂方法getInstance()和范围' singleton'的通用bean。

如果您在网络应用中使用Spring,我建议您使用它PropertyPlaceholderConfigurer

如果您不想使用Spring,并且需要在启动webapp时在servlet上执行某些操作(例如加载属性文件),那么请使用ServletContextListener作为Bhesh Gurung的建议。