【发布时间】:2017-06-16 12:50:20
【问题描述】:
我们制作了自己的框架,可以轻松设置分析管道。 每次分析结束时,都会调用 finish()。 finish() 上传分析期间生成的文件。 为确保正确使用框架,我们检查了 finish() 是否没有被调用两次。
现在,我想测试是否为管道中的特定步骤调用了 finish()。 我通过在测试中调用以下代码来做到这一点:
verify(consumer).finish();
但显然,verify() 也调用了 finish(),所以会抛出异常并且测试失败。
现在,我的问题是:
- 如何避免finish() 被调用两次?
编辑
问题的快速设置:
分析
package mockitoTwice;
public class Analysis extends Finishable {
@Override
public void finishHelper() {
System.out.println("Calling finishHelper()");
}
}
可完成
package mockitoTwice;
public abstract class Finishable {
protected boolean finished = false;
public final void finish() {
System.out.println("Calling finish()");
if (finished) {
throw new IllegalStateException();
}
finished = true;
finishHelper();
}
public abstract void finishHelper();
}
管道
package mockitoTwice;
public class Pipeline {
private Analysis analysis;
public Pipeline(Analysis analysis) {
this.analysis = analysis;
}
public void runAnalyses() {
analysis.finish();
}
}
管道测试
package mockitoTwice;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import org.junit.Test;
public class PipelineTest {
@Test
public void test() {
Analysis analysis = mock(Analysis.class);
Pipeline pipeline = new Pipeline(analysis);
pipeline.runAnalyses();
verify(analysis).finish();
}
}
【问题讨论】:
标签: java unit-testing testing mockito