Mockito将固执算为调用



尝试使用自定义匹配器将类固执/返回路径固执...遇到了兴趣问题。

这是我写的测试,以说明...

这可能很难实现,但是我预计当第一个when(...).thenReturn(...)

固执时,第一ArgumentMatcher不会被调用。

但在下面运行代码在Stdout上打印foobar。我们可以做些什么来防止这种行为?或者,我是通过尝试与多个自定义ArgumentMatcher

对单个模拟的模拟使用错误的模式

fyi - powermock在我的类Path上进行其他测试(不确定这是否重要,但我确实在堆栈跟踪中看到了)

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);
    }
}

编辑添加了注释以帮助说明

如果使用 doReturn()语法,则该方法未调用。

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

有关更多详细信息,请参见此答案。另外,文档解释了此用例(重点是我的):

对于任何方法,您可以使用doreturn(),[...]代替对应的调用。当您:

时,有必要
  • 存根空白方法
  • 间谍对象上的存根方法(见下文)
  • 存根不止一次,以在测试中间更改模拟的行为。

相关内容

  • 没有找到相关文章

最新更新