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));