java - 加载静态属性文件类

标签 java unit-testing properties dependency-injection

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

使用静态类代替它可以加载一次(当服务器启动或其他东西时..)而不是使用单例不是更好吗?为什么和为什么不呢?

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

PS:项目是Web应用程序

最佳答案

单例比静态更适合依赖注入(inject)和单元测试。

您可以将单例类的实例或该类型的模拟注入(inject)到任何其他正在测试的类中。

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 框架,例如 Spring ,用于连接 bean 。 PropertiesHolder 将是一个具有工厂方法 getInstance() 和作用域“singleton”的通用 bean。

如果您在 Web 应用程序中使用 Spring,我建议使用它的 PropertyPlaceholderConfigurer .

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

关于java - 加载静态属性文件类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22672333/

相关文章:

java.lang.ArrayIndexOutOfBoundsException : 41981 during tomcat start 异常

java - 将 json 对象中的日期发送到 Restful ws

unit-testing - Selenium 支持 headless 浏览器测试吗?

c# - 使用最小起订量进行单元测试期间设置属性时出错

ios - 获取UITextField默认层iOS 7

iphone - 在 ViewController 上找不到属性

java - 如何将 jingle_peerconnection_so.so 文件加载到 eclipse 中的 android 项目?

java - Valgrind 检测 Java Web 应用程序中的内存泄漏

mysql - 包括数据库在内的单元测试应用程序太慢

vb.net - VB扩展属性,而不是扩展方法