Mockito 无法验证线程中的调用 运行
Mockito unable to verify invocation in thread run
我正在尝试测试 Runnable class,但无法验证内部 class 调用。但是通过调试模式,我可以看到“k.put(c);”被感动了
有谁知道为什么 Mockito 找不到对“verify(k).put(any(C.class))”的调用;以及如何验证它?
Class待测
public class SampleClass implements Runnable {
private static final Logger LOGGER = LoggerFactory.getLogger(SampleClass.class);
private K k;
@Inject
public SampleClass (final K k) {
this.k = k;
}
@Override
public void run() {
while (!k.isFinished()) {
final C c = k.pull();
if (c == null) {
break;
}
k.put(c);
}
}
}
测试Class
@RunWith(MockitoJUnitRunner.class)
public class SampleClassTest extends TestBase {
@Mock
private K k;
private SampleClass sampleClass;
@Before
public void setup() {
sampleClass = new SampleClass(k);
}
@Test
public void testRun() {
// Prepare
when(k.isFinished()).thenReturn(false);
final C c = buildC();
when(k.pull()).thenReturn(c);
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
// Run
scheduler.scheduleAtFixedRate(sampleClass, 0, 1, TimeUnit.SECONDS);
// Verify
verify(k).put(any(C.class));
}
}
您实际上并没有在验证步骤之前 运行设置您的 Runnable
。相反,您将其安排在稍后 运行。
幸运的是,Mockito 提供了一种等待响应的方法:
scheduler.scheduleAtFixedRate(sampleClass, 0, 1, TimeUnit.SECONDS);
verify(k, timeout(100).atLeastOnce()).put(any(C.class));
我正在尝试测试 Runnable class,但无法验证内部 class 调用。但是通过调试模式,我可以看到“k.put(c);”被感动了
有谁知道为什么 Mockito 找不到对“verify(k).put(any(C.class))”的调用;以及如何验证它?
Class待测
public class SampleClass implements Runnable {
private static final Logger LOGGER = LoggerFactory.getLogger(SampleClass.class);
private K k;
@Inject
public SampleClass (final K k) {
this.k = k;
}
@Override
public void run() {
while (!k.isFinished()) {
final C c = k.pull();
if (c == null) {
break;
}
k.put(c);
}
}
}
测试Class
@RunWith(MockitoJUnitRunner.class)
public class SampleClassTest extends TestBase {
@Mock
private K k;
private SampleClass sampleClass;
@Before
public void setup() {
sampleClass = new SampleClass(k);
}
@Test
public void testRun() {
// Prepare
when(k.isFinished()).thenReturn(false);
final C c = buildC();
when(k.pull()).thenReturn(c);
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
// Run
scheduler.scheduleAtFixedRate(sampleClass, 0, 1, TimeUnit.SECONDS);
// Verify
verify(k).put(any(C.class));
}
}
您实际上并没有在验证步骤之前 运行设置您的 Runnable
。相反,您将其安排在稍后 运行。
幸运的是,Mockito 提供了一种等待响应的方法:
scheduler.scheduleAtFixedRate(sampleClass, 0, 1, TimeUnit.SECONDS);
verify(k, timeout(100).atLeastOnce()).put(any(C.class));