如果 Java 中的方法存在于外部 jar 中,如何模拟该方法?
How to mock a method in Java, if that method present in external jar?
我正在为内部调用以下方法的方法编写一个 junit :
extensionManager.registerPlugin(extension);
这里的 extensionManager 是外部 jar class 的对象。为此,我尝试了以下操作:
ExtensionManager em = new ExtensionManager();
ExtensionManager emSpy = spy(em);
PowerMockito.doNothing().when(emSpy,
"registerPlugin",Mockito.any());
注意:registerPlugin 方法 return 类型为 void。
但这对我不起作用。它正在调用真正的方法。谁能帮帮我。
mock 本身的创建看起来是正确的,但您没有展示完整的测试,尤其是您如何使用 create spy。
您需要检查两件事。
首先,您需要确保调用 extensionManager.registerPlugin(extension);
的代码使用了间谍,即您创建的 emSpy
对象。此处的模拟仅针对您创建的对象的实例发生。如果您在测试中的代码创建了另一个您未在测试中替换的 extensionManager
,则调用不会被模拟,真正的 registerPlugin
将被调用。
第二件事是,如果 registerPlugin
是私有的或 ExtensionManager
class 是最终的,那么您需要在测试 class 中使用 @PrepareForTest(ExtensionManager.class)
,如前所述在 powermock documentation
我正在为内部调用以下方法的方法编写一个 junit :
extensionManager.registerPlugin(extension);
这里的 extensionManager 是外部 jar class 的对象。为此,我尝试了以下操作:
ExtensionManager em = new ExtensionManager();
ExtensionManager emSpy = spy(em);
PowerMockito.doNothing().when(emSpy,
"registerPlugin",Mockito.any());
注意:registerPlugin 方法 return 类型为 void。
但这对我不起作用。它正在调用真正的方法。谁能帮帮我。
mock 本身的创建看起来是正确的,但您没有展示完整的测试,尤其是您如何使用 create spy。
您需要检查两件事。
首先,您需要确保调用 extensionManager.registerPlugin(extension);
的代码使用了间谍,即您创建的 emSpy
对象。此处的模拟仅针对您创建的对象的实例发生。如果您在测试中的代码创建了另一个您未在测试中替换的 extensionManager
,则调用不会被模拟,真正的 registerPlugin
将被调用。
第二件事是,如果 registerPlugin
是私有的或 ExtensionManager
class 是最终的,那么您需要在测试 class 中使用 @PrepareForTest(ExtensionManager.class)
,如前所述在 powermock documentation