我有一个要测试的应用程序:

import foo.ExtClass;
public class App {
  public static void main(String[] args) {
     ExtClass ext = new ExtClass();
     ...
  }
}


我想为此应用程序编写一个单元测试,但是我不想使用foo.ExtClass,而是对该类使用另一个模拟实现。

通常,我会使用工厂根据可以在单元测试中控制的某些配置实例化该类。
但是,在这种情况下,我无法修改经过测试的应用程序。

我正在考虑编写一个自定义类加载器来加载模拟类而不是真实类的方向-不知道是否可以在不对测试应用程序进行任何修改的情况下以及如何进行加载。

最佳答案

作为一种选择,您可以使用自定义类加载器,该类加载器将用测试类替换您的类。因此,基本上,您的类加载器不会从应用程序包中加载ExtClass,而是会通过模拟实现从测试包中加载同一类。

这是一个例子:

How to replace classes in a running application in java ?

还有一个非常有用的教程:https://zeroturnaround.com/rebellabs/reloading-objects-classes-classloaders/

10-06 16:11