问题描述
我想对以下场景进行单元测试:
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
调用类的构造函数。但我想你已经明白了。