部分模拟亲子类

问题描述

我想对以下场景进行单元测试:

class Base {
  public void doWork(Consumer<Pipe> consumer) {
    try {
      Pipeline pipeline = acquirePipeline()
      consumer.accept(pipeline);
      pipeline.sync();
    } finally {
      unlock();
    }
  }
}

class Worker extends Base {
  // whatever...
}


class Service {
  private Worker worker = ..

  public void handle() {
    worker.doWork((p) -> {
      // run some code...
    };

  }

我的测试代码

class ServiceTest {
  public test() throws Exception {
     
     Worker worker = newMock(Worker.class);
     worker.whileLocked(any(Runnable));
     reply(worker);

     Service service = new Service(worker);
     service.handle();

     verify(worker);
  }
}

我已经部分模拟了 Worker,但为了让 Service 中的代码正常运行,我无法模拟 doWork(我认为),如果我不模拟它那么当代码运行 NullPointerException 时我会得到 doWork,因为数据成员没有初始化。

知道如何处理这种情况吗?

解决方法

您可以考虑使用 Mockito 代替 EasyMock 吗?

在那种情况下,有一种方法可以在模拟类上调用真正的方法。

doCallRealMethod().when(worker).whileLocked(any(Runnable.class));

我不使用 EasyMock,我试图找到一些帮助但我找不到。

,

使用 EasyMock 创建部分模拟时,您可以使用 partialMockBuilder 调用类的构造函数。但我想你已经明白了。