Java 如何模拟类的每个实例

Java 如何模拟类的每个实例,java,mocking,powermock,easymock,Java,Mocking,Powermock,Easymock,我想以这种方式模拟我的java类,这样它的每个新实例都应该返回模拟的响应。基本上是: PowerMockito.whenNew(MyOriginalClass.class).withNoArguments().thenReturn(new MyMockClass()); 您还需要使用@RunWith(PowerMockRunner.class) 和@PrepareForTest(调用构造函数或originalclass.class的类)作为JUnit测试类的类注释。如果您有多个实例化MyOri

我想以这种方式模拟我的java类,这样它的每个新实例都应该返回模拟的响应。

基本上是:

PowerMockito.whenNew(MyOriginalClass.class).withNoArguments().thenReturn(new MyMockClass());
您还需要使用
@RunWith(PowerMockRunner.class)

@PrepareForTest(调用构造函数或originalclass.class的类)
作为JUnit测试类的类注释。如果您有多个实例化MyOriinalClass的类,您还可以指定整个包:
@PrepareForTest(“com.mypackage.*)

有两个模拟库支持此功能:PowerMock(如Matthias的回答所示)和JMockit


在第二种情况下,测试只需要使用
@mock
注释声明一个mock字段或mock参数。

您可以将该类命名为AlwaysMockedMay,因为您应该使用getInstance()方法创建一个工厂类,并从该方法返回一个mock对象。与其调用new,不如调用getInstance(),它将始终返回一个mock对象。我不熟悉
JMockit
,但我希望在delared mock字段上使用
@mock
,将创建一个分配给该字段的mock实例。如果它“截获”一个调用
new MyOriginalClass()
,以创建一个模拟对象,它会感到惊讶。@MatthiasJ.Sax一旦一个类被
@mock
,它的所有实例都会被模拟;就这么简单。为了记录和/或验证期望,创建并分配给模拟字段(或测试方法参数)的实例是所有此类实例的代表。因此,一个
新的MyOriginalClass()
构造函数执行确实会被“拦截”,但这是模拟实例本身,不需要创建另一个.intercept。谢谢你的澄清!