"无效使用参数匹配器"但我只使用匹配器

时间:2016-02-28 14:38:17

标签: java testing junit mockito

我收到错误消息:

  

org.mockito.exceptions.misusing.InvalidUseOfMatchersException:   参数匹配器的使用无效!   0匹配预期,1记录:    - > at * .SegmentExportingTest.happyDay(SegmentExportingTest.java:37)   如果匹配器与原始值组合,则可能发生此异常:       //不正确:       someMethod(anyObject()," raw String");   使用匹配器时,所有参数都必须由匹配器提供。   例如:   //正确:       someMethod(anyObject(),eq(" matcher by matcher"));

但实际上我只在方法的参数中使用匹配器。

下一个代码是上述错误的来源。

ConfigReader configReader = mock(ConfigReader.class);
    when(configReader.getSparkConfig())
            .thenReturn(new SparkConf().setMaster("local[2]").setAppName("app"));
    when(configReader.getHBaseConfiguration()).thenReturn(new Configuration());

    SparkProfilesReader sparkProfilesReader = mock(SparkProfilesReader.class);
    ProfileSegmentExporter profileSegmentExporter = mock(ProfileSegmentExporter.class);

    //--
    new SegmentExporting().process(configReader, sparkProfilesReader, profileSegmentExporter);
    //--

    InOrder inOrder = inOrder(sparkProfilesReader, profileSegmentExporter);
    inOrder.verify(sparkProfilesReader).readProfiles(any(JavaSparkContext.class),
            refEq(configReader.getHBaseConfiguration()));

1 个答案:

答案 0 :(得分:5)

在评论中解决:

  

我在单独的行中解压缩了configReader.getHBaseConfiguration()并隐藏了该问题。

您的具体问题是您在设置匹配器时调用了模拟方法

表明问题的两行是:

when(configReader.getHBaseConfiguration()).thenReturn(new Configuration());
// ...
inOrder.verify(sparkProfilesReader).readProfiles(any(JavaSparkContext.class),
    refEq(configReader.getHBaseConfiguration()));

正如我在a previous SO post中所写,Mockito匹配器主要通过副作用工作,因此Matcher方法和模拟对象方法之间的调用顺序对Mockito及其验证很重要。对configReader.getHBaseConfiguration()的调用是在调用any(JavaSparkContext.class)之后调用模拟(在第一行中建立),这会让Mockito认为你正在验证零参数方法{{1使用getHBaseConfiguration匹配的一个参数。这就是错误消息“0匹配预期,1记录”的原因:0代表any而1代表getHBaseConfiguration

为了安全起见,在使用Mockito匹配器时,请确保传递给匹配器的值都是预先计算的:它们都应该是常量文字,简单的数学表达式或变量。在存根/验证开始之前,任何涉及方法调用的东西都应该被提取到局部变量。