【问题标题】:"Invalid use of argument matchers" but I use matchers only“无效使用参数匹配器”,但我只使用匹配器
【发布时间】:2016-02-28 14:38:16
【问题描述】:

我收到错误消息:

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 参数匹配器的使用无效! 预期 0 个匹配器,记录 1 个: -> 在 *.SegmentExportingTest.happyDay(SegmentExportingTest.java:37) 如果匹配器与原始值组合,则可能会发生此异常: //不正确: someMethod(anyObject(), "原始字符串"); 使用匹配器时,所有参数都必须由匹配器提供。 例如: //正确的: 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() 并隐藏了问题。

标签: java testing junit mockito


【解决方案1】:

在 cmets 中解决:

我在单独的行中提取了 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 误以为您正在使用一个参数验证零参数方法getHBaseConfiguration any 匹配。这就是错误消息显示“0 个匹配器预期,1 个已记录”的原因:0 代表 getHBaseConfiguration,1 代表 any(JavaSparkContext.class)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 2020-09-17
    相关资源
    最近更新 更多