PowerMockito 正在调用真实方法而不是模拟私有方法
PowerMockito is calling real method instead of mocked private one
我有一个 class,它有一个私有方法并在其主体中调用另一个私有方法。所以我想调用第一个私有方法并模拟第二个。这是一个例子:
public class ClassWithPrivateMethod {
private int count;
public ClassWithPrivateMethod() {
}
private void countDown() {
while (isDecrementable())
count--;
}
private boolean isDecrementable() {
throw new IllegalArgumentException();
// if (count > 0) return true;
// return false;
}
}
并测试class:
@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassWithPrivateMethodTest.class)
public class ClassWithPrivateMethodTest {
private int count;
private ClassWithPrivateMethod classWithPrivateMethod;
@Before
public void setUp() throws Exception {
count = 3;
classWithPrivateMethod = PowerMockito.spy(new ClassWithPrivateMethod());
}
@Test
public void countDown() throws Exception {
Whitebox.setInternalState(classWithPrivateMethod, "count", count);
PowerMockito.doReturn(true, true, false).when(classWithPrivateMethod, "isDecrementable");
Whitebox.invokeMethod(classWithPrivateMethod, "countDown");
int count = Whitebox.getInternalState(classWithPrivateMethod, "count");
assertEquals(1, count);
PowerMockito.verifyPrivate(classWithPrivateMethod, times(3)).invoke("isDecrementable");
}
}
我通过 Whitebox.invokeMethod(classWithPrivateMethod, "countDown");
调用了第一个私有方法,并像这样模拟了第二个私有方法 PowerMockito.doReturn(true, true, false).when(classWithPrivateMethod, "isDecrementable");
。如您所见,isDecrementable
方法在调用时应 return true
、true
、false
值,但 PowerMockito 正在调用真正的方法。
我正在使用这些依赖项:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.6.5</version>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.6.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.10.19</version>
</dependency>
我的测试有什么问题?
我发现这一行有误:
@PrepareForTest(ClassWithPrivateMethodTest.class)
应该是:
@PrepareForTest(ClassWithPrivateMethod.class)
我有一个 class,它有一个私有方法并在其主体中调用另一个私有方法。所以我想调用第一个私有方法并模拟第二个。这是一个例子:
public class ClassWithPrivateMethod {
private int count;
public ClassWithPrivateMethod() {
}
private void countDown() {
while (isDecrementable())
count--;
}
private boolean isDecrementable() {
throw new IllegalArgumentException();
// if (count > 0) return true;
// return false;
}
}
并测试class:
@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassWithPrivateMethodTest.class)
public class ClassWithPrivateMethodTest {
private int count;
private ClassWithPrivateMethod classWithPrivateMethod;
@Before
public void setUp() throws Exception {
count = 3;
classWithPrivateMethod = PowerMockito.spy(new ClassWithPrivateMethod());
}
@Test
public void countDown() throws Exception {
Whitebox.setInternalState(classWithPrivateMethod, "count", count);
PowerMockito.doReturn(true, true, false).when(classWithPrivateMethod, "isDecrementable");
Whitebox.invokeMethod(classWithPrivateMethod, "countDown");
int count = Whitebox.getInternalState(classWithPrivateMethod, "count");
assertEquals(1, count);
PowerMockito.verifyPrivate(classWithPrivateMethod, times(3)).invoke("isDecrementable");
}
}
我通过 Whitebox.invokeMethod(classWithPrivateMethod, "countDown");
调用了第一个私有方法,并像这样模拟了第二个私有方法 PowerMockito.doReturn(true, true, false).when(classWithPrivateMethod, "isDecrementable");
。如您所见,isDecrementable
方法在调用时应 return true
、true
、false
值,但 PowerMockito 正在调用真正的方法。
我正在使用这些依赖项:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.6.5</version>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.6.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.10.19</version>
</dependency>
我的测试有什么问题?
我发现这一行有误:
@PrepareForTest(ClassWithPrivateMethodTest.class)
应该是:
@PrepareForTest(ClassWithPrivateMethod.class)