我可以从静态代码外部 "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 的模拟实现创建了一个单独的项目, 和单元测试。

这样模拟实现在真正实现之前出现在类路径中,并且原始(测试)项目保持不变。