【发布时间】:2015-11-15 08:03:13
【问题描述】:
我想存根存储库类来测试另一个具有存储库的类(Holder 类)。 repository 接口支持 CRUD 操作,方法很多,但是我对 Holder 类的单元测试只需要调用其中的两个。仓库界面:
public interface IRepo {
public void remove(String... sarr);
public void add(String... sarr);
//Lots of other methods I don't need now
}
我想创建一个可以存储实例的存储库模拟,仅为add 和remove 定义逻辑,并提供一种在调用 add 和 remove 后检查存储在其中的方法。强>
如果我这样做:
IRepo repoMock = mock(IRepo.class);
然后我有一个哑对象,它对每个方法都不做任何事情。没关系,现在我只需要定义添加和删除的行为。
我可以创建一个Set<String> 并仅存根这两种方法以在片场上工作。然后我会实例化一个拥有 IRepo 的 Holder,注入部分存根的 mock,并在执行完 holder 后,检查集合以验证它是否包含它应该包含的内容。
我已经设法使用已弃用的方法 stubVoid 部分存根像 remove 这样的 void 方法:
Set<String> mySet = new HashSet<>();
stubVoid(repoMock).toAnswer(new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
Object[] args = invocation.getArguments();
String[] stringsToDelete = (String[]) args[0];
mySet.removeAll(Arrays.asList(stringsToDelete));
return null;
}
}).on().remove(Matchers.<String>anyVararg());
但已被弃用,它并不比为 IRepo 创建部分实现好多少。有没有更好的办法?
注意:请只回答 Java 7,这应该在 Android 中运行。
【问题讨论】:
标签: java unit-testing mockito void stubbing