使用 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 注释)。
我有两个 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 注释)。