我可以从静态代码之外“替换”Java类吗?

时间:2018-05-07 10:30:31

标签: java testing classloader

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

作为一个选项,您可以使用自定义类加载器,它将使用测试版替换您的类。所以基本上不是从你的app包中加载ExtClass,你的类加载器将使用模拟实现从你的测试包中加载相同的类。

以下是一个例子:

How to replace classes in a running application in java ?

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

答案 1 :(得分:0)

我最终使用的方法: 使用我的模拟实现foo.ExtClass创建了一个单独的项目, 和单元测试。

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