Mockito:如何存根无效方法以在调用时运行一些代码

新手上路,请多包涵

我想存根一个存储库类来测试另一个具有存储库的类(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
}

我想创建一个可以存储实例的存储库模拟, addremove 定义逻辑,还提供一种在调用添加和删除后检查存储在其上的内容的方法。

如果我做:

 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 许可协议

阅读 349
2 个回答

您可以使用

  Mockito.doAnswer(new Answer<Void>() {
        @Override
        public Void answer(InvocationOnMock invocation) throws Throwable {
            //DO SOMETHING
            return null;
        }
    }).when(...).remove(Matchers.<String>anyVararg());

来自 Javadoc:

当您想用通用 Answer 存根 void 方法时,请使用 doAnswer()。

Stubbing voids 需要与 Mockito.when(Object) 不同的方法,因为编译器不喜欢括号内的 void 方法……

例子:

     doAnswer(new Answer() {
    public Object answer(InvocationOnMock invocation) {
        Object[] args = invocation.getArguments();
        Mock mock = invocation.getMock();
        return null;
    }}).when(mock).someMethod();

请参阅 Mockito 的 javadoc 中的示例

原文由 Jens 发布,翻译遵循 CC BY-SA 3.0 许可协议

假设你有

public class IFace {
    public void yourMethod() {
    }
}

然后模拟它你需要

    IFace mock = Mockito.mock(IFace.class);
    Mockito.doAnswer(new Answer() {
        @Override
        public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
            //PUT YOUR CODE HERE
            return null;
        }
    }).when(mock).yourMethod();

原文由 talex 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题