使用EasyMock模拟scheduleWithFixedDelay方法

时间:2019-01-10 10:07:42

标签: unit-testing testing easymock

如何使用easyMock在以下代码中模拟start()函数?

class A {

    public runOnce(Integer a) {
       // do something
    }

    public void start() {
        executor.scheduleWithFixedDelay(() -> runOnce(12), 0, 1000, TimeUnit.MILLISECONDS);
    }
}

我尝试了以下不起作用的方法:

ScheduledExecutorService executorService = createMock(ScheduledExecutorService.class);
executorService.scheduleWithFixedDelay(anyObject(), eq(0), eq(1000), eq(TimeUnit.MILLISECONDS));
expectLastCall().andReturn(null);

A a = createMockBuilder(A.class).addMockedMethod(A.class.getDeclaredMethod("runOnce", Integer.class)).createMock();

a.runOnce(12);
expectLastCall();

replay(executorService);
a.start();
verify(executorService);

有人可以建议我如何解决它吗?

1 个答案:

答案 0 :(得分:0)

我在这里看到两个问题。首先,您没有将模拟的executorService注入到您的A实例中。我假设您可以使用构造函数来做到这一点。

A a = createMockBuilder(A.class)
        .addMockedMethod(A.class.getDeclaredMethod("runOnce", Integer.class))
        .withConstructor(executorService)
        .createMock();

然后,匹配器需要在参数中采用正确的类型。因此,这里scheduleWithFixedDelay期望long。所以期望应该是

expect(executorService.scheduleWithFixedDelay(anyObject(), eq(0L), eq(1000L), eq(TimeUnit.MILLISECONDS)))
    .andReturn(null);

这样做可以使一切顺利运行。