Java 如何模拟返回接口引用的新实例

Java 如何模拟返回接口引用的新实例,java,junit,mockito,powermockito,Java,Junit,Mockito,Powermockito,我有这样一个场景 MyInterface myObject = new MyInterfaceImplementedClass(); myObject.get(...) 我想模仿MyInterfaceImplementedClass,我试过如下方法 private MyInterface mockMyObject private MyInterfaceImplementedClass mockMyClassObject // the below compilation error when

我有这样一个场景

MyInterface myObject = new MyInterfaceImplementedClass();
myObject.get(...)
我想模仿MyInterfaceImplementedClass,我试过如下方法

private MyInterface mockMyObject
private MyInterfaceImplementedClass mockMyClassObject

// the below compilation error 
whenNew(MyInterfaceImplementedClass.class).withNoArguments().thenReturn(mockMyObject);
// no compilation error but not giving mocking instance at runtime
whenNew(MyInterfaceImplementedClass.class).withNoArguments().thenReturn(mockMyClassObject);

请帮助我在评论中解决此问题:

将我的测试类添加到side@PrepareForTest之后,它就如预期的那样工作了

简而言之,Mockito为您试图模拟的类编写一个生成的子类,这允许它拦截可重写方法(即非最终实例方法)的行为。这将处理所有接口以及大多数抽象和具体的类。但是,如果您试图模拟
final
static
方法(包括构造函数)的行为,Mockito做不了什么:消费类包含对真实实现的引用,而无需查找虚拟方法表。唯一的出路是重写和替换现有类的字节码,这正是PowerMock所做的

它通常会覆盖您试图模拟的类,但在某些情况下,您需要列出被测试的类或测试类本身

因此,几乎所有使用PowerMock特性的测试都需要一个
@PrepareForTest
,以及一个
@RunWith
语句,以确保测试类使用PowerMock的类加载器来启用重写



1自Mockito 2.1以来,Mockito可以使用插入指令的类加载器来执行一些以前仅在PowerMock中可用的操作。

什么是“但在运行时不提供mocking实例”?在使用PowerMockito时,在测试类上查看
@RunWith
@PrepareForTest
注释是非常重要的。请编辑您的问题以包含它们。(PowerMock操纵Java类加载器,因此这些注释通常是失败和成功的区别。)如果您不使用这些注释,请告诉我们:这可能是解决问题的一个非常快速的方法!嗨,杰夫,是的,你是对的,在@PrepareForTest侧添加我的测试类后,它按预期工作,非常感谢你的帮助伟大的解释杰夫,谢谢you@user3346145不客气!如果您对此答案感到满意,可以单击答案框上方和旁边的复选标记。这是一种很好的方式,可以告诉大家这个问题已经得到了回答,并为您的后续行动提供一点代表奖励。祝你工作顺利!