我想存根一个存储库类来测试另一个具有存储库的类(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
定义逻辑,还提供一种在调用添加和删除后检查存储在其上的内容的方法。
如果我做:
IRepo repoMock = mock(IRepo.class);
然后我有一个对每个方法什么都不做的哑对象。没关系,现在我只需要定义添加和删除的行为。
我可以创建一个 Set<String>
并仅存根这两种方法以在集合上工作。然后我将实例化一个具有 IRepo 的 Holder,注入部分存根的模拟,并在运行 holder 之后,检查集合以验证它包含它应该包含的内容。
我设法使用已弃用的方法 stubVoid
部分存根了一个无效的方法,如 remove
:
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 中运行。
原文由 Mister Smith 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以使用
来自 Javadoc:
请参阅 Mockito 的 javadoc 中的示例