【问题标题】:Mock a scheduleWithFixedDelay method using EasyMock使用 EasyMock 模拟 scheduleWithFixedDelay 方法
【发布时间】:2019-01-10 10:07:42
【问题描述】:

如何使用 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);

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

【问题讨论】:

    标签: unit-testing testing easymock


    【解决方案1】:

    我在这里看到两个问题。首先,您没有将模拟的 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);
    

    这样做可以让一切顺利进行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多