我有以下简单的代码。我有一个类(TestClass),我想测试“someMethod”。有一个外部静态方法,由我的“someMethod”调用。我想Powermock那个静态方法给我一些虚拟对象。我在开头有@PrepareForTest(ExternalClass.class),但是当我执行它时会给出错误:
ExternalClass类没有准备好进行测试。要准备此类,请将类添加到'@PrepareForTest'
注释中。如果您不使用此批注,请在类或方法级别添加批注。
请帮我指出我使用@PrepareForTest
的方式有什么问题
@RunWith(PowerMockRunner.class)
@PrepareForTest(ExternalClass.class)
public class xyzTest {
@Mock
private RestTemplate restTemplate;
@Mock
private TestClass testClass;
@BeforeClass
private void setUpBeforeClass() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testSuccessCase() {
Boolean mockResponse = true;
ResponseEntity<Boolean> response = new ResponseEntity<Boolean>(mockResponse, HttpStatus.OK);
SomeClass someClass = new SomeClass("test", "1.0.0", "someUrl", "someMetaData");
PowerMockito.mockStatic(ExternalClass.class);
Mockito.when(restTemplate.postForEntity(any(String.class), any(String.class), eq(Boolean.class))).thenReturn(response);
Mockito.when(ExternalClass.getSomeClass(any(String.class))).thenReturn(someClass);
Boolean result = testClass.someMethod("test");
Assert.isTrue(result);
Mockito.verify(restTemplate, times(1)).postForObject(any(String.class), any(String.class), any());
}
}
确保将@RunWith(PowerMockRunner.class)
添加到班级的顶部。
与最后一个答案一样,我的问题是混合了TestNG的Test annotation而不是Junit Test。
import org.junit.Test; // works
import org.testng.annotations.Test // did not work
非常深奥的错误,我花了超过5小时调试:(
我有同样的错误,通过添加解决了这个问题
@Rule
public PowerMockRule rule = new PowerMockRule();
在测试类里面。
对于那些试图使用Junit 5的人,如果您使用声称与4+兼容的powermock-module-junit4
beta版本,该库仍然无法识别:
import org.junit.jupiter.api.Test;
它会抛出一个:
org.powermock.api.mockito.ClassNotPreparedException
当@PrepareForTest
应用于你想要静态模拟的类时。如果你想使用PowerMock,你必须回到Junit 4或者为你的静态方法创建一个MockWrapper。
PowerMock 2.0:Github Roadmap
我有同样的错误,但解决了它。我的问题是我包括了powermock-module-junit4
,但包括我的测试注释来自TestNG而不是Junit。
如果上面的答案不起作用,请尝试extends PowerMockTestCase
。这招对我有用。
示例:public class xyzTest extends PowerMockTestCase
我有同样的错误。我正在使用TestNG来运行测试。我不得不使用以下方法来解决上述问题。
@ObjectFactory
public IObjectFactory getObjectFactory() {
return new PowerMockObjectFactory();
}
虽然这里的评价最高的答案毫无疑问是正确的,但这并没有回答为什么需要这样做的问题;或者,例如,为什么同样的事情不适用于添加@RunWith(MockitoJUnitRunner.class)
。
事情是PowerMockRunner
在引擎盖下使用instrumentation API,通过javassist库,这允许改变类,如删除final
或模拟static
(非编译时常量)。
在修改(检测)某个类的过程中,他们添加了一个接口,称为PowerMockModified
。它是一个标记接口,表示发生了某种字节码检测。稍后在代码中,他们只是通过这样的方法检查你在@PrepareForTest
中使用的类是否实际上是以某种方式进行了检测:
private boolean isModifiedByPowerMock() {
return PowerMockModified.class.isAssignableFrom(this.type);
}
事实证明,PowerMockRunner
做了一些仪器,而MockitoJUnitRunner
没有;因此你得到的错误。