Java 重构静态类以便对其进行单元测试
我有一个静态类,我想重构它,这样我可以更改属性文件的名称等,并且可以更容易地进行单元测试 目前我有:Java 重构静态类以便对其进行单元测试,java,Java,我有一个静态类,我想重构它,这样我可以更改属性文件的名称等,并且可以更容易地进行单元测试 目前我有: public enum MySettings { INSTANCE; //priv vars private string applicationUrl; private MySettings() { MappingJsonFactory jf = new MappingJsonFactory(); ClassLoader classLoade
public enum MySettings {
INSTANCE;
//priv vars
private string applicationUrl;
private MySettings() {
MappingJsonFactory jf = new MappingJsonFactory();
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream mySettingsInputStream = classLoader.getResourceAsStream("a.properties");
Properties mySettingsProperties = new Properties().load(mySettingsInputStream);
// code below to load json and set priv vars etc.
}
public String getApplicationUrl() {
return applicationUrl;
}
}
在单元测试中,如何将属性文件的名称设置为其他名称?“控制反转”。最简单的方法是将其作为构造函数参数。更高端的是国际奥委会的框架,如Spring
更糟糕的情况是,因为您正在处理一个枚举
——可能需要考虑一个接口,然后提供一个实现的枚举。或者更好:
public enum Settings {
PRODUCTION("prod.xml"), UNIT_TESTING("dev.xml");
//...
“控制反转。”最简单的方法是将其作为构造函数arg。更高端的是国际奥委会的框架,如Spring
更糟糕的情况是,因为您正在处理一个枚举
——可能需要考虑一个接口,然后提供一个实现的枚举。或者更好:
public enum Settings {
PRODUCTION("prod.xml"), UNIT_TESTING("dev.xml");
//...
您可以将enum类中的所有内容整理成一个真正的可实例化类(通过包保护或受保护),然后通过enum(getter)访问它的实例。像这样,你可以像一个符咒一样对所有东西进行单元测试,也可以将它作为一个单体:)。这样就不需要第二个枚举常量(如注释中所指出的) 如果您使用的是protected而不是package protection,则可以通过创建一个从实际类继承的虚拟类来对其进行单元测试,并在测试中对其进行实例化,如下所示:
private static class Dummy extends NewClass {
public Dummy() {
super();
}
}
您可以将enum类中的所有内容整理成一个真正的可实例化类(通过包保护或受保护),然后通过enum(getter)访问它的实例。像这样,你可以像一个符咒一样对所有东西进行单元测试,也可以将它作为一个单体:)。这样就不需要第二个枚举常量(如注释中所指出的) 如果您使用的是protected而不是package protection,则可以通过创建一个从实际类继承的虚拟类来对其进行单元测试,并在测试中对其进行实例化,如下所示:
private static class Dummy extends NewClass {
public Dummy() {
super();
}
}
将其作为构造函数arg传递?也许可以使用setter访问它。或者将其保存在常量类中的a.properties部分。@OliCharlesworth是否将参数传递给枚举构造函数?不…@MattBall:是的,我没注意到这是一个枚举。但是,很明显,如果OP希望它是非静态的,他需要使用一个实际的类…将它作为构造函数arg传递进来?也许可以使用setter访问它。或者将其保存在常量类中的a.properties部分。@OliCharlesworth是否将参数传递给枚举构造函数?不…@MattBall:是的,我没注意到这是一个枚举。但是,很明显,如果OP希望它是非静态的,他将需要使用一个实际的类……在枚举中使用第二个版本的想法非常巧妙:P.简单,但功能强大。@MartinBraun:嗯,也许吧。单元测试的一个关键原则是在要测试的代码中没有特殊的“if_test_mode”钩子。。。(我想这就是第二个想法的含义)@OliCharlesworth请看我的答案。谢谢,实际上我可以创建一个空构造函数,然后创建一个带参数的构造函数,然后进行链接,这样我就不必修改所有其他引用了。谢谢。@OliCharlesworth,很可能会分解出一个接口;通过单独构造枚举,这是非常健康的,因为不同的是数据驱动的(而且OP听起来很有必要,我的意思是,单元测试不应该针对isntance影响生产DBs)。在枚举中使用第二个版本的想法非常巧妙:P.简单,但功能强大。@MartinBraun:Hmm,也许吧。单元测试的一个关键原则是在要测试的代码中没有特殊的“if_test_mode”钩子。。。(我想这就是第二个想法的含义)@OliCharlesworth请看我的答案。谢谢,实际上我可以创建一个空构造函数,然后创建一个带参数的构造函数,然后进行链接,这样我就不必修改所有其他引用了。谢谢。@OliCharlesworth,很可能会分解出一个接口;通过单独构造枚举,这是非常健康的,因为不同的是数据驱动的(而且OP听起来很有必要,我的意思是,单元测试不应该影响iNtance的生产数据库)。