使用 JMockit 中现有的 class 模拟 class(替换 `redefineMethods`)

Mocking class with existing class in JMockit (replacement for `redefineMethods`)

我有两个 classes 作为输入,我想用一个来模拟另一个。以前在JMockit里很简单,一个就叫

Mockit.redefineMethods(originalClass, mockingClass);

但在 0.999 版本中,这个弃用的方法被删除了。我需要更新版本的 JMockit 的功能,所以我不能再使用旧版本了。

根据弃用消息中的文档,我猜想使用建议的 "modern" 方法来定义 MockUp<originalClass> 并将其用作 mockingClass

不幸的是,我在运行时将两个值都作为输入参数获取(声明为 class<?>),因此创建 class 不是一个选项。

有什么方法可以模仿 Mockit.redefineMethods() 在 0.999 版本之前所做的事情,即使它可能不是解决此问题的最优雅的解决方案?

编辑

我得到的输入是要模拟的 Map<Class<?>, Class<?>> mockedClasses 个 classes 指向 classes 模拟它们。然后将它们迭代并传递给 Mockit:

for (Map.Entry<Class<?>, Class<?>> entry : mockedClasses.entrySet()) {
  Mockit.redefineMethods(entry.getKey(), entry.getValue());
}

之后,执行测试代码,然后再次禁用模拟,以类似的方式使用restoreOriginalDefinition()代替redefineMethods()

好了,现在问题更清楚了。答案是没有办法用另一个任意的 class 来模拟 class;您必须将实体模型 class 定义为 MockUp 的子 class。非常旧的 Mockit.redefineMethods(Class, Class)(从 4.5+ 年前的 API 中删除)只接受任意 classes 因为最初的 API 也支持 Java 1.4 测试代码(自 0.999 起不再支持,需要泛型 and/or 注释)。