我有以下简单代码。我有一个课程(测试阶级),我想测试" somemethod"。有一种外部静态方法,由我的" somemethod"称为。我想为powermock恢复一些虚拟对象。我在开始中有@preparefortest(externalClass.class),但是当我执行时,它会出现错误:
班级外部阶级未准备进行测试。要准备此类课程,请将类添加到'@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)
添加到同类的顶部。
:: EDIT ::两年后...
永远不要使用PowerMockito,您不需要。
如果确实需要,您很可能会违反坚实的原则,并且您的设计是错误的。
改用设计。
与最后一个答案一样,我的问题也是混合了测试NG而不是Junit Test的测试注释。
import org.junit.Test; // works
import org.testng.annotations.Test // did not work
非常令人讨厌的错误,我花费了超过5个小时的调试:(
对于那些试图与junit 5一起使用的人,如果您使用的是powermock-module-junit4
beta版本,该版本声称与4 兼容,则该库仍然无法识别:
import org.junit.jupiter.api.Test;
它将抛出:
org.powermock.api.mockito.ClassNotPreparedException
当将@PrepareForTest
应用于要静态模拟的类上时。如果您想使用PowerMock,则必须返回Junit 4或目前为静态方法创建Mockwrapper。
PowerMock 2.0:GitHub路线图
毫无疑问,此处的最高答案是正确的,但这并没有回答为什么需要的问题;或者,例如,为什么同一件事不适用于添加@RunWith(MockitoJUnitRunner.class)
。
事实是PowerMockRunner
在引擎盖下使用仪器API,Javassist库,这允许更改类,例如删除final
或模拟static
(非编译时间常数)。
在修改(仪器)某个类的过程中,它们添加了一个接口,称为PowerMockModified
。这是一个标记接口,表示发生了某个字节代码仪器。在代码的后面,他们只需检查您在@PrepareForTest
中使用的类是否实际上是通过某种方式来仪器的,通过这种方法:
private boolean isModifiedByPowerMock() {
return PowerMockModified.class.isAssignableFrom(this.type);
}
事实证明, PowerMockRunner
做一些仪器,而 MockitoJUnitRunner
却没有;因此,您遇到的错误。
我有相同的错误,通过添加
解决了这一点@Rule
public PowerMockRule rule = new PowerMockRule();
在测试类中。
检查import org.junit.test;软件包已导入,而不是API木星。
如果上述答案不工作,请尝试extends PowerMockTestCase
。这个技巧对我有用。
示例: public class xyzTest extends PowerMockTestCase
我有相同的错误,但解决了。我的问题是我包括powermock-module-junit4
,但包括我的测试注释,而不是Junit。
i有相同的错误。我正在使用TestNG运行测试。我必须使用以下方法来解决上述问题。
@ObjectFactory
public IObjectFactory getObjectFactory() {
return new PowerMockObjectFactory();
}
用于testng,有2个选项,如下:
- 使用以下的对象捕集:
@ObjectFactory
public IObjectFactory getObjectFactory() {
return new PowerMockObjectFactory();
}
- 测试类扩展
extends org.powermock.modules.testng.PowerMockTestCase
我的gradle使用junit 5。
test {
useJUnitPlatform()
}
我能够调试这个。通过在PowerMockrunner方法中具有断点。它没有被调用。此外,Junit 5不受PowerMockito的支持。
看起来Junit5在没有@ExtendWith的情况下运行。
确保您正在使用 PowerMock2 。当我使用 PowerMock 时,我遇到了这个问题。使用
import org.powermock2.api.mockito.PowerMockito;