Mockito:如何在调用时使用void方法来运行一些代码

Mis*_*ith 12 java unit-testing void mockito stubbing

我想存根一个存储库类来测试另一个具有存储库的类(Holder类).存储库接口支持CRUD操作,并且有很多方法,但我对Holder类的单元测试只需要调用其中的两个.存储库界面:

public interface IRepo {
    public void remove(String... sarr);

    public void add(String... sarr);

    //Lots of other methods I don't need now
}
Run Code Online (Sandbox Code Playgroud)

我想创建一个可以存储的情况下,用于定义逻辑库模拟addremove唯一的,并提供检查什么叫添加和删除后存储在其上的一种手段.

如果我做:

IRepo repoMock = mock(IRepo.class);
Run Code Online (Sandbox Code Playgroud)

然后我有一个愚蠢的对象,对每种方法都没有任何作用.没关系,现在我只需要定义添加和删除的行为.

我可以创建一个Set<String>和存根只有那两个方法来处理集合.然后我将实例化一个具有IRepo的Holder,注入部分存根模拟,并在执行持有者之后,检查该集以验证它包含它应该是什么.

我设法部分存根一个void方法,比如remove使用弃用的方法stubVoid:

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());
Run Code Online (Sandbox Code Playgroud)

但是已被弃用,并且它比为IRepo创建部分实现要好得多.有没有更好的办法?

注意:Java 7只应答,这应该在Android中运行.

Jen*_*ens 18

您可以使用

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

来自Javadoc:

如果要使用通用答案存根void方法,请使用doAnswer().

Stubbing void需要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();
Run Code Online (Sandbox Code Playgroud)

请参阅javadoc for Mockito中的示例


tal*_*lex 5

假设你有

public class IFace {
    public void yourMethod() {            
    }
}
Run Code Online (Sandbox Code Playgroud)

然后要模拟它,你需要

    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();
Run Code Online (Sandbox Code Playgroud)