mock-maker-inline 使测试失败 "NotAMockException Argument passed to Mockito.mockingDetails() should be a mock" on non-final non-static class

mock-maker-inline makes test fail with "NotAMockException Argument passed to Mockito.mockingDetails() should be a mock" on non-final non-static class

我有一个 JUnit 测试,其中有 5 个模拟,其中一个模拟 classes 是最终的,我启用 mock-maker-inline 来克服这个问题,现在测试通过了,但是在测试执行结束时我还在以下位置获得 NotAMockException:

org.mockito.exceptions.misusing.NotAMockException: Argument passed to Mockito.mockingDetails() should be a mock, but is an instance of class ...Locals!
at org.mockito.internal.runners.DefaultInternalRunner.testFinished(DefaultInternalRunner.java:63)
    at org.junit.runner.notification.SynchronizedRunListener.testFinished(SynchronizedRunListener.java:56)
    at org.junit.runner.notification.RunNotifier.notifyListener(RunNotifier.java:190)
    at org.junit.runner.notification.RunNotifier$SafeNotifier.run(RunNotifier.java:72)
    at org.junit.runner.notification.RunNotifier.fireTestFinished(RunNotifier.java:187)
    at org.junit.internal.runners.model.EachTestNotifier.fireTestFinished(EachTestNotifier.java:38)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:331)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access[=12=]0(ParentRunner.java:58)
    at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.mockito.internal.runners.DefaultInternalRunner.run(DefaultInternalRunner.java:74)
    at org.mockito.internal.runners.DefaultInternalRunner.run(DefaultInternalRunner.java:80)
    at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:39)
    at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:163)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
...

模拟很简单:

    @Mock
    private Locals locals; //class

    @Mock
    private Globals globals; // class

    @Mock
    private Cache cache; // interface

    @Mock
    private Reminds reminds; // final class

    @Mock
    private Employeereminds employeereminds; // class

...然后是几个 when().thenReturn() 设置以使其协同工作

在测试模拟过程中看起来像这样:

locals = {Locals@3233} 
globals = {Globals@3234} 
cache = {Cache$MockitoMock5734991@3237} "cache"
reminds = {Reminds@3235} 
employeereminds = {Employeereminds@3236} 

我正在使用 Mockito 2.25.0 也尝试过 2.28.2 但没有区别。

我可以重构我的测试以测试 final class 的内容,但我更喜欢孤立的测试。我也可以使用 powermock,但看到与 powermock 报告的类似问题。

有没有人偶然发现这个问题并找到合适的解决方法?

编辑: 我做了更多调查,我删除了 Locals Mock 并在 Globals mock 上得到了同样的错误。然后我删除了 Globals 模拟并得到 (!?) 以下异常 (@ v2.28.2):

org.mockito.exceptions.misusing.NotAMockException: Argument passed to Mockito.mockingDetails() should be a mock, but is an instance of class Cache$MockitoMock9288076!

    at org.mockito.internal.runners.DefaultInternalRunner.testFinished(DefaultInternalRunner.java:63)
    at org.junit.runner.notification.SynchronizedRunListener.testFinished(SynchronizedRunListener.java:56)
    at org.junit.runner.notification.RunNotifier.notifyListener(RunNotifier.java:190)
    at org.junit.runner.notification.RunNotifier$SafeNotifier.run(RunNotifier.java:72)
    at org.junit.runner.notification.RunNotifier.fireTestFinished(RunNotifier.java:187)
    at org.junit.internal.runners.model.EachTestNotifier.fireTestFinished(EachTestNotifier.java:38)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:331)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access[=15=]0(ParentRunner.java:58)
    at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.mockito.internal.runners.DefaultInternalRunner.run(DefaultInternalRunner.java:74)
    at org.mockito.internal.runners.DefaultInternalRunner.run(DefaultInternalRunner.java:80)
    at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:39)
    at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:163)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    ...

好的,我发现了问题: 我正在调用

Mockito.framework().clearInlineMocks();

@After注解调用的代码中,但正确的做法是在@AfterClass注解调用的代码中执行,否则Mockito自己的验证是运行你清除了嘲笑。