在运行单元测试时,读取不同属性集的正确方法是什么

时间:2012-05-31 12:57:45

标签: java tdd

我希望将某些类(FactoryProviders)配置为在单元测试中使用时表现不同。

public class ConnectionFactoryProvider {

    public static IConnectionFactory getConnectionFactory() {
        //return MockConnectionFactory if running in test mode and
        //DefaultConnectionFactory is running in production mode
    }

}

我需要返回一个不同的ConnectionFactory,具体取决于代码是在测试模式(单元测试)还是生产模式下运行。

实现这一目标的正确方法是什么?我想到了一些可能的解决方案......但是其中任何一个都是广泛使用的习惯用法吗?

  • 通过JVM args的系统属性,使得在生产和测试模式下运行时,该值将不同。
  • 在工具属性文件中保留工厂的完全限定名称,并确保在测试模式下运行时,文件系统上有不同的属性文件。这对于Maven来说很容易,因为我们可以在测试阶段运行时控制类路径顺序,但我不确定在Eclipse中运行单元测试时是否可以实现。
  • 在测试设置方法中配置ConnectionFactoryProvider,使其返回MockConnectionFactory

2 个答案:

答案 0 :(得分:5)

依赖注入(DI)。你的ConnnectionFactories是依赖项。 DI将允许您将ConnectionFactory的实例作为构造函数参数发送。这样,单元测试将发送一个MockConnectionFactory实例,实时代码将发送一个DefaultConnectionFactory实例。

public class ConnectionFactoryProvider {
    public static IConnectionFactory getConnectionFactory(IConnectionFactory connectionFactory) {
    //use the connectionFactory
    }
}

//unit test
ConnectionFactoryProvider cfp = new ConnectionFactoryProvider(aMockConnectionFactoryInstance);

//live code
ConnectionFactoryProvider cfp = new ConnectionFactoryProvider(aDefaultConnectionFactoryInstance);

希望有所帮助。

P.S。我是一名C#开发人员,但我认为Java语法或多或少与你相同。

答案 1 :(得分:1)

我在代码应用程序中使用以下两种方法:

  1. 读取可包含符号名称的系统属性。在生产中,使用默认值。符号名称映射到配置文件,该文件解释了名称的含义。

    这样,您可以拥有任意数量的配置文件,您可以在运行时添加配置(无需更改代码即可在生产中启用更多日志记录来跟踪错误)。

    示例:系统属性的名称为db.config。符号名称为h2itprod(默认)。配置文件在${configPath}/db-${db.config}.xml

  2. 中打开
  3. 根据属性user.name读取配置。这使您可以轻松地为每个开发人员提供自己的配置。如果没有具有该名称的配置文件,则读取默认配置(或者始终读取默认配置,然后将其与可选的每用户配置合并)