powermock mocking构造函数通过whennew()不能与匿名类一起使用

我有一个DummyResource类和一个DummyTarget文件,以及一个测试类TestDummyResource,如下所示,但DummyResource dr = mock(DummyResource.class)对象DummyResource dr = mock(DummyResource.class)仅在我在一个普通类中调用构造函数时才有效,当它在一个匿名类中调用时,它调用的是实际的构造函数,而不是使用模拟对象。

版本:

powermock 1.4.12 mockito 1.9.0 junit 4.8.2

DummyTarget.java:

 import java.io.IOException; import java.io.OutputStream; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.StreamingOutput; public class DummyTarget { public StreamingOutput testMocking() { return new StreamingOutput() { @Override public void write(OutputStream arg0) throws IOException, WebApplicationException { new DummyResource(); } }; } } 

DummyResource.java:

 package com.smin.dummy; public class DummyResource { public DummyResource() { System.out.println("mock failure"); } } 

TestDummyResource.java:

 package com.smin.dummy; import static org.mockito.Mockito.mock; import java.io.IOException; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.StreamingOutput; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest({DummyResource.class,DummyTarget.class}) public class TestDummyResource { @Before public void setUp() throws Exception { DummyResource dr = mock(DummyResource.class); PowerMockito.whenNew(DummyResource.class).withNoArguments().thenReturn(dr); } @Test public void testMocked() throws WebApplicationException, IOException { new DummyResource(); // it uses the mocked object dr here, //doesn't print "mock failure" StreamingOutput sop = new DummyTarget().testMocking(); sop.write(null); // it calls DummyResource's constructor, // prints ""mock failure"" here } } 

看起来匿名类可能会inheritance定义它的类的包。 你能尝试一下PrepareForTest的通配符吗?:

 @PrepareForTest("com.smin.dummy.*") 

如果这不起作用,您可以尝试使用猎枪PrepareEverythingForTest Annotation。

你需要准备调用构造函数的类,而不是调用构造函数的类,以下应该修复你:

 @PrepareForTest(DummyTarget.class) 

有关更多信息,请查看此页面。

实际上,您必须准备测试构造函数调用的类,而不是调用构造函数的类。 请参阅https://github.com/jayway/powermock/wiki/MockConstructor 。

在你的情况下,你应该使用@PrepareForTest(DummyTarget.class)

我遇到了同样的问题,并使用带有完全限定名称的whenNew解决了这个问题。 在您的情况下,内部匿名类的完全限定名称是:

 DummyTarget.class + "$1" 

所以你应该创建一个该类的模拟:

 DummyResource dr = mock(Class.forName(DummyTarget.class + "$1")); 

它会对你有用。

另外,不要忘记准备DummyTarget类:

 @PrepareForTest(DummyTarget.class) 

希望它有所帮助=]