我可以从静态代码外部 "replace" a Java class 吗?
Can I "replace" a Java class from outside of a static code?
我有一个要测试的应用程序:
import foo.ExtClass;
public class App {
public static void main(String[] args) {
ExtClass ext = new ExtClass();
...
}
}
我想为此应用程序编写单元测试,但我不想使用 foo.ExtClass,而是为 class 使用另一个模拟实现。
通常我会根据一些可以在单元测试中控制的配置使用工厂来实例化class。
但是,在这种情况下,我无法修改测试的应用程序。
我正在考虑编写自定义 class 加载程序来加载模拟 class 而不是真正的 class - 不确定是否可以不对测试的应用程序,以及如何。
作为一个选项,您可以使用自定义 class 加载程序,它将用测试加载程序替换您的 class。所以基本上不是从你的应用程序包加载 ExtClass
,你的 classloader 将从你的测试包加载相同的 class 和模拟实现。
这是一个例子:
How to replace classes in a running application in java ?
还有非常有用的教程:https://zeroturnaround.com/rebellabs/reloading-objects-classes-classloaders/
我最终使用的方法:
使用 foo.ExtClass 的模拟实现创建了一个单独的项目,
和单元测试。
这样模拟实现在真正实现之前出现在类路径中,并且原始(测试)项目保持不变。
我有一个要测试的应用程序:
import foo.ExtClass;
public class App {
public static void main(String[] args) {
ExtClass ext = new ExtClass();
...
}
}
我想为此应用程序编写单元测试,但我不想使用 foo.ExtClass,而是为 class 使用另一个模拟实现。
通常我会根据一些可以在单元测试中控制的配置使用工厂来实例化class。 但是,在这种情况下,我无法修改测试的应用程序。
我正在考虑编写自定义 class 加载程序来加载模拟 class 而不是真正的 class - 不确定是否可以不对测试的应用程序,以及如何。
作为一个选项,您可以使用自定义 class 加载程序,它将用测试加载程序替换您的 class。所以基本上不是从你的应用程序包加载 ExtClass
,你的 classloader 将从你的测试包加载相同的 class 和模拟实现。
这是一个例子:
How to replace classes in a running application in java ?
还有非常有用的教程:https://zeroturnaround.com/rebellabs/reloading-objects-classes-classloaders/
我最终使用的方法: 使用 foo.ExtClass 的模拟实现创建了一个单独的项目, 和单元测试。
这样模拟实现在真正实现之前出现在类路径中,并且原始(测试)项目保持不变。