【问题标题】:Mockito counting stubbing as invocationMockito 将存根计数为调用
【发布时间】:2017-04-17 17:14:08
【问题描述】:

尝试使用自定义 Matcher 对具有 2 个可能的调用/返回路径的类进行存根...遇到了一个兴趣问题。

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

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

但运行下面的代码会在标准输出上打印foobar。我们能做些什么来防止这种行为吗?或者我是否通过尝试使用多个自定义 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);

    }
}

EDIT添加了 cmets 来帮助说明

【问题讨论】:

    标签: java unit-testing mockito junit4 powermock


    【解决方案1】:

    如果您使用doReturn() 语法,则不会调用该方法。

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

    请参阅this answer 了解更多详情。另外,the docs 解释这个用例(强调我的):

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

    • 存根无效方法
    • 间谍对象的存根方法(见下文)
    • 多次存根同一方法,以在测试过程中更改模拟的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多