问题描述
public String doSomething(Dependency dep) {
StringBuilder content = new StringBuilder();
String response;
while ((response = dep.get()) != null) {
content.append(response);
}
return content.toString();
}
下面是我的测试用例。基本上我希望 Dependency#get()
方法在第一次迭代中返回 "content"
,在第二次迭代中返回 null
。
@Test
void test(@Mocked Dependency dep) {
new Expectations() {
{
dep.get();
result = "content";
times = 1;
}
};
Assertions.assertEquals("content",testSubject.doSomething(dep));
}
然而,这会导致 JMockit 抛出 Unexpected invocation to: Dependency#get()
错误。如果我删除 times
字段,我的测试将永远循环运行。
如何测试这种方法?
解决方法
所以我发现除了 result
参数之外,JMockit 还可以设置一个 returns(args...)
方法,我们可以将一系列参数按顺序传递给它。因此,将测试修改为此对我有用。
@Test
void test(@Mocked Dependency dep) {
new Expectations() {
{
dep.get();
returns("content",null);
times = 2; // limiting to mock only twice as only 2 values are provided in returns
}
};
Assertions.assertEquals("content",testSubject.doSomething(dep));
}