【发布时间】:2016-10-21 20:34:41
【问题描述】:
我有以下简单的代码。我有一个类(TestClass),我想测试“someMethod”。我的“someMethod”调用了一个外部静态方法。 我想对该静态方法进行 Powermock 以返回一些虚拟对象。 我一开始就有@PrepareForTest(ExternalClass.class),但是当我执行它时会出现错误:
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());
}
}
【问题讨论】:
-
您是在桌面 JVM 中的 JUnit4 上运行此类,对吧?而ExternalClass不是一个Java系统类?
-
是的,我在桌面 JVM(Oracle,1.8)上运行它。而 ExternalClass 是一个自定义的 Java 类(不是 Java 系统类:即 java*.*)
-
我看到您正在使用
MockitoAnnotations.initMocks(...)以及 Powermock JUnit Runner。这是不必要的。 Powermock 运行器将设置您的模拟。我不知道这是否会对您的情况有所帮助,因为我遇到了同样的问题,而且我没有再调用来初始化模拟。 -
对我来说效果很好。您使用的是哪些 Mockito 和 Powermockito 版本?
-
您绝对应该按照@Dan 的建议检查您的导入。但是您可能还会遇到由
@BeforeClass注释应用于非静态方法setUpBeforeClass引起的初始化问题。