Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 运行单元测试时,读取不同属性集的正确方法是什么_Java_Tdd - Fatal编程技术网

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

Java 运行单元测试时,读取不同属性集的正确方法是什么,java,tdd,Java,Tdd,我想将某些类(FactoryProviders)配置为在单元测试中使用时表现不同 public class ConnectionFactoryProvider { public static IConnectionFactory getConnectionFactory() { //return MockConnectionFactory if running in test mode and //DefaultConnectionFactory is

我想将某些类(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
  • 依赖注入(DI)。您的ConnectionFactory是依赖项。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中的语法或多或少与您相同。

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

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

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

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

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


  • 你有没有考虑过使用a?assylias是对的。模拟框架将非常有用。@assylias我同时使用模拟和伪对象。我在想,我是否可以用一种足够小的方式梳理出设计,这样我就可以把代码放在这里,而不会变得太复杂。非常有趣的想法。我特别发现使用user.name的想法非常有趣。不知何故,我对使用它感到不舒服,因为它似乎在软件中添加了很多移动部件,使它有点脆弱。但是它还是充满了有趣的可能性。你能把ConnectionFactoryProvider变成一个单例吗?你绝对能做到。或者不是。将在ConnectionFactoryProvider的实现中处理;但是,这不会影响使用DI的决定。是的,我同意,如果我正确理解您的意思,您是说ConnectionFactoryProvider本身可以配置和DI'dYes,这就是我所说的。