Mockito计算存根作为调用

ech*_*hen 5 java unit-testing junit4 mockito powermock

尝试使用自定义匹配器来存储具有2个可能的调用/返回路径的类...遇到了兴趣问题.

这是我写的一个测试来说明......

这可能很难实现,但我希望ArgumentMatcher在第二个存根时不会调用1stwhen(...).thenReturn(...)

但运行下面的代码打印foobar在stdout上.我们可以做些什么来防止这种行为?或者我通过尝试使用多个自定义来存储单个模拟来使用错误的模式ArgumentMatcher

仅供参考 - powermock我的类路径用于其他测试(不确定是否重要,但我确实在堆栈跟踪中看到它)

import org.junit.Test;
import org.mockito.ArgumentMatcher;

import java.io.File;
import java.io.FilenameFilter;

import static org.mockito.Matchers.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public class MyTest {
    @Test
    public void name() throws Exception {
        File file = mock(File.class);
        when(file.list(argThat(new ArgumentMatcher<FilenameFilter>() {
            @Override
            public boolean matches(Object argument) {
                System.out.println("foobar");
                return 1 + 1 >2;
            }
        }))).thenReturn(null);
        // at this point, mockito will attempt to run the previous matcher, treating this stub code as invocation ... and printing out 'foobar'
        when(file.list(argThat(new ArgumentMatcher<FilenameFilter>() {
            @Override
            public boolean matches(Object argument) {
                System.out.println("barbar");
                return true;
            }
        }))).thenReturn(null);

    }
}
Run Code Online (Sandbox Code Playgroud)

编辑添加了评论以帮助说明

nic*_*ckb 5

如果使用doReturn()语法,则不调用该方法.

doReturn(null).when(file).list(argThat(new ArgumentMatcher<FilenameFilter>() {
    @Override
    public boolean matches(Object argument) {
        System.out.println("barbar");
        return true;
    }
}));
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅此答案.此外,文档解释了这个用例(强调我的):

对于任何方法,您都可以使用doReturn(),[...]代替when()的相应调用.你有必要:

  • stub void方法
  • 间谍对象的存根方法(见下文)
  • 多次使用相同的方法,在测试过程中更改模拟的行为.