Java mock maker内联使测试失败,并带有;传递给Mockito.mockingDetails()的NotMockException参数应为mock;关于非最终非静态类

Java mock maker内联使测试失败,并带有;传递给Mockito.mockingDetails()的NotMockException参数应为mock;关于非最终非静态类,java,junit,mockito,Java,Junit,Mockito,我有一个JUnit测试,其中我有5个mock,其中一个mock类是final,我启用了mock maker inline来克服这个问题,现在测试通过了,但在测试执行结束时,我还得到NotAMockException: org.mockito.exceptions.misusing.NotAMockException: Argument passed to Mockito.mockingDetails() should be a mock, but is an instance of class

我有一个JUnit测试,其中我有5个mock,其中一个mock类是final,我启用了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$1$2.testFinished(DefaultInternalRunner.java:63)
    at org.junit.runner.notification.SynchronizedRunListener.testFinished(SynchronizedRunListener.java:56)
    at org.junit.runner.notification.RunNotifier$7.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$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.mockito.internal.runners.DefaultInternalRunner$1.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$MockitoMock$665734991@3237} "cache"
reminds = {Reminds@3235} 
employeereminds = {Employeereminds@3236} 
我正在使用Mockito 2.25.0,也尝试了2.28.2,但没有区别

我可以重构我的测试来测试最终类的内容,但我更喜欢独立测试。我也可以使用powermock,但也看到过powermock报告的类似问题

有没有人偶然发现了这样的问题,并找到了一个体面的解决办法

编辑:我做了更多的调查,删除了
本地人
Mock,在
全局人
Mock上得到了相同的错误。然后我删除了
Globals
mock,得到了以下异常(@v2.28.2):

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

Mockito.framework().clearInlineMocks();

@After
注释调用的代码中,但正确的方法是在
@AfterClass
注释调用的代码中执行此操作,否则,Mockito自己的验证将在您清除mock后运行。

目前,我已从Strict runner切换到Silent runner,但这不是我喜欢的解决方案。您能展示Locals类及其测试吗?您好,我在测试中做了一些排除,以查明问题,它似乎不是特定于Locals类,因为它在几乎每个mock上都会出现,甚至抱怨
Cache
应该是mock,但它是
Cache$MockitoMock$149288076
谢谢。这一次把我的头从墙上摔下来<代码>@AfterClass void AfterClass(){Mockito.framework().clearilinemocks();}
Mockito.framework().clearInlineMocks();