【发布时间】:2016-03-11 00:25:10
【问题描述】:
我正在测试一个在 AtomicBoolean 值更改之前一直运行的 Task 类。我正在使用 PowerMockito,因为 AtomicBoolean 实例的 get() 方法是最终的。
MyTaskTest 看起来像这样:
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import java.util.concurrent.atomic.AtomicBoolean;
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(AtomicBoolean.class)
public class MyTaskTest {
private AtomicBoolean stopReceiving;
private MyTask task;
@Before
public void setUp() {
stopReceiving = PowerMockito.mock(AtomicBoolean.class);
task = new MyTask(stopReceiving);
}
@Test
public void test_run_when_StopReceivingIsFalseFromTheBeginning_should_invokeGetOnlyOnce() {
// given
PowerMockito.when(stopReceiving.get()).thenReturn(false);
// when
task.run();
// then
verify(stopReceiving, times(1)).get();
}
}
MyTask 类看起来像这样:
import java.util.concurrent.atomic.AtomicBoolean;
public class MyTask implements Runnable {
private final AtomicBoolean stopReceiving;
MyTask(AtomicBoolean stopReceiving) {
if (stopReceiving == null) {
throw new NullPointerException("stopReceiving is null. This argument should not be null");
}
this.stopReceiving = stopReceiving;
}
@Override
public void run() {
while (stopReceiving.get() == true) {
System.out.println("I should not get to here!");
}
}
}
这里的问题是检查 verify(stopReceiving, times(1)).get(); 失败:
需要但未调用 java.util.concurrent.atomic.AtomicBoolean.get();其实有 与此模拟的零交互。
这对我来说没有意义,因为它显然是在 run() 方法中调用的。我什至调试了它,它通过了run 方法,但不知何故并没有增加它的调用计数器。我在这里做错了什么?
附:我正在使用 PowerMockito 1.6.2 版
我尝试了什么
- 将验证调用更改为在没有
times(1)的情况下调用。没有帮助 - 将 powermockito 版本升级到 1.6.3。没有帮助
- 将 MyTask 作为内部类添加到 MyTaskTest 中,这以某种方式起作用,这意味着验证调用已通过,但我希望将 MyTask 包含在其他文件作为单独的类,这仍然不起作用。
【问题讨论】:
标签: java junit mockito powermock