【问题标题】:Mockito / Powermock: matcher any() falsely does not match (but anyOrNull() doesMockito / Powermock:匹配器 any() 错误地不匹配(但 anyOrNull() 确实
【发布时间】:2020-05-01 08:57:24
【问题描述】:

我在一个用 Kotlin 编写的 Android 单元测试中使用 Mockito / Powermock。 我的代码如下:

verify(myCompanionMock, atLeastOnce()).someMethod(any(), any())

但我收到此错误:

Comparison Failure: 
<Click to see difference>

Argument(s) are different! Wanted:
companion.someMethod(
    <any java.io.File>,
    <any java.io.File>
);
-> at org.powermock.core.MockGateway.doMethodCall(MockGateway.java:182)
Actual invocation has different arguments:
companion.someMethod(
    null,
    null
);

因此,如果我将匹配器 any() 替换为 anyOrNull() 测试通过。我已经使用调试器来验证实际的 File 对象(不是模拟)是否传递给 someMethod()。我还验证了静态 Companion 对象的模拟是否有效。 (它上面的所有其他测试都按预期运行)。

静态 Companion 类是用 Kotlin 编写的。调用 Companion 的测试类是用 Java 编写的。这些类的@PrepareForTest-annotations 设置正确(所有其他测试按预期工作)

所以我想知道我是否遗漏了什么,或者这是我不知道的 Mockito 匹配器的问题?

【问题讨论】:

  • 您传递给someMethodFile 变量是否已初始化?
  • 是的。我在调试器会话期间验证了这一点
  • verify 方法来自哪个类?如果是纯 Mockito,您是否有其他测试可以成功验证静态方法参数? PowerMock 文档描述了使用参数匹配器的不同方式:github.com/powermock/powermock/wiki/…

标签: android kotlin mockito junit4 powermockito


【解决方案1】:

这似乎是在 PowerMock 中使用参数匹配器的推荐方式:

// class containing static method
public class Companion {
    public static void someMethod(File a, File b) { }
}

// test class
@RunWith(PowerMockRunner.class)
@PrepareForTest(Companion.class)
public class CompanionTest {

    @Test
    public void testCompanion() {

        PowerMockito.mockStatic(Companion.class);

        // call method with non-null arguments
        Companion.someMethod(Mockito.mock(File.class), Mockito.mock(File.class));

        // verify
        PowerMockito.verifyStatic(Companion.class);
        Companion.someMethod((File) ArgumentMatchers.notNull(), 
                             (File) ArgumentMatchers.notNull());
    }
}

这适用于我使用 JUnit 4、Mockito 2.28.2 和 PowerMock 2.0.2。

【讨论】:

  • 我将我的库升级到了 Mockito 2.28.2 和 PowerMock 2.0.2。并将您的代码重写为 Kotlin(因为我的测试是在 Kotlin 中进行的)。相同的问题,但略有不同的异常:java.lang.IllegalStateException: ArgumentMatchers.notNull() must not be null
  • 当我用 any() mather 替换 notNull() 时: PowerMockito.verifyStatic(Companion::class.java, atLeastOnce()) Companion.someMethod(any(), any( )) 测试通过但我仍然得到一个异常: org.mockito.exceptions.misusing.UnfinishedVerificationException: Missing method call for verify(mock) here: -> 在 STACKTRACE 指向测试方法
  • @r-hold,如果你分享你的代码,我会在我的机器上试试。
猜你喜欢
  • 1970-01-01
  • 2016-02-02
  • 2016-06-15
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多