"Invalid use of argument matchers"但我只使用匹配器



我收到错误消息:

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 参数匹配器的使用无效! 预计 0 名匹配者,1 名记录: -> 在 *。SegmentExportingTest.happyDay(SegmentExportingTest.java:37) 如果匹配器与原始值组合在一起,则可能会出现此异常: 不對: someMethod(anyObject(), "raw String"); 使用匹配器时,所有参数都必须由匹配器提供。 例如: 正确: someMethod(anyObject(), eq("String 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()));

在注释中解决:

我在单独的行中提取了configReader.getHBaseConfiguration(),问题被隐藏了。

您的具体问题是您在设置匹配器的过程中调用了一个模拟方法


指示问题的两行是:

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

正如我在之前的SO文章中所写的那样,Mockito匹配器主要通过副作用工作,因此Matcher方法和模拟对象方法之间的调用顺序对于Mockito及其验证非常重要。对configReader.getHBaseConfiguration()的调用是在你调用any(JavaSparkContext.class)之后发生的对模拟的调用(如第一行中建立的那样),这使Mockito误以为你正在使用一个any匹配的参数来验证零arg方法getHBaseConfiguration。这就是为什么错误消息显示"预计有 0 个匹配者,1 个记录":0 表示getHBaseConfiguration,1 表示any(JavaSparkContext.class)

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

相关内容

  • 没有找到相关文章

最新更新