首先,我使用的是 Scala,但任何 Java 方法都可以。(为了便于理解,我将使用 Java 代码作为示例。)
假设我有一个Connection
接口及其实现RealConnection
和FakeConnection
.
我想在我的应用程序中有两个条目:一个发布条目和一个测试条目。我想像往常一样对我的应用程序进行编码,然后开始我的测试,该测试使用发布版本所做的所有类,但有一个例外,它使用FakeConnection
而不是RealConnection
.
我的应用程序通过Connection.get()
.
我不想要的是这样的:
public static Connection get() {
if ( isReleaseVersion )
return new RealConnection();
return new FakeConnection();
}
我希望我的应用程序代码不会被这种代码污染。
可能有一个Config
对象,如:
public static Connection get() {
return Config.getConnectionFactory().get();
}
Config
这里的问题是每次我想测试时都需要更改课程。如果没有其他方法,我可能会使用这种方法。
我不想使用的是二传手。我想处理final
变量或函数!不是这样的:
public class TestEntry {
public static void main(String... args) }
Config.connectionFactory = new FakeConnectionFactory();
Config.databaseConnection = new FakeDatabaseConnection(); // Singleton, no factory needed.
MyApplication.start(args); // the ReleaseEntry is somewhere else!
}
}
我也不想使用的是Guice
. 每次我想进行测试时,我都必须重新定义我的模块。另外,我一般不会在 Scala 中使用它。
Reflection
有可能,但错误只会出现在运行时,所以它不是一个非常 .
有没有其他方法可以完成我想要的?
我必须顺其自然Config
吗?
问候。