我希望将某些类(FactoryProviders)配置为在单元测试中使用时表现不同。
public class ConnectionFactoryProvider {
public static IConnectionFactory getConnectionFactory() {
//return MockConnectionFactory if running in test mode and
//DefaultConnectionFactory is running in production mode
}
}
我需要返回一个不同的ConnectionFactory,具体取决于代码是在测试模式(单元测试)还是生产模式下运行。
实现这一目标的正确方法是什么?我想到了一些可能的解决方案......但是其中任何一个都是广泛使用的习惯用法吗?
答案 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)
我在代码应用程序中使用以下两种方法:
读取可包含符号名称的系统属性。在生产中,使用默认值。符号名称映射到配置文件,该文件解释了名称的含义。
这样,您可以拥有任意数量的配置文件,您可以在运行时添加配置(无需更改代码即可在生产中启用更多日志记录来跟踪错误)。
示例:系统属性的名称为db.config
。符号名称为h2
,it
,prod
(默认)。配置文件在${configPath}/db-${db.config}.xml
根据属性user.name
读取配置。这使您可以轻松地为每个开发人员提供自己的配置。如果没有具有该名称的配置文件,则读取默认配置(或者始终读取默认配置,然后将其与可选的每用户配置合并)