【问题标题】:What is the right way to read a different set of properties when running unit tests运行单元测试时读取一组不同属性的正确方法是什么
【发布时间】:2012-05-31 12:57:44
【问题描述】:

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

public class ConnectionFactoryProvider {

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

}

我需要根据代码是在测试模式(单元测试)还是生产模式下运行,返回不同的 ConnectionFactory。

实现这一目标的正确方法是什么?我想到了一些可能的解决方案……但其中任何一个是广为流传的成语吗?

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

【问题讨论】:

  • 您考虑过使用mocking framework吗?
  • assylias 是对的。一个模拟框架会很有帮助。
  • @assylias 我同时使用了 Mock 和假对象。我正在考虑是否可以以足够小的方式梳理设计,这样我就可以将代码放在这里而不会变得太复杂。

标签: java tdd


【解决方案1】:

依赖注入 (DI)。您的 ConnectFactories 是依赖项。 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);

希望对您有所帮助。

附:我是一名 C# 开发人员,但我认为 Java 中的语法对你来说或多或少是相同的。

【讨论】:

  • 你会把 ConnectionFactoryProvider 变成一个单例吗?
  • 你绝对可以做到。或不。这将在 ConnectionFactoryProvider 的实现中处理;但是,它不会影响使用 DI 的决定。
  • 是的,我同意,如果我理解正确,您是说 ConnectionFactoryProvider 本身可以被配置和 DI
  • 是的,我就是这么说的。
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 非常有趣的想法。我特别发现使用 user.name 的想法非常有趣。不知何故,我不习惯使用它,因为它似乎在软件中添加了很多移动部件并使其有点脆弱。但它仍然充满了有趣的可能性。
猜你喜欢
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-01
  • 1970-01-01
相关资源
最近更新 更多