java - mock-maker-inline 使测试失败,并在非最终非静态类上“传递给 Mockito.mockingDetails() 的 NotAMockException 参数应该是一个模拟”
问题描述
我有一个 JUnit 测试,其中有 5 个模拟,其中一个模拟类是最终的,我启用了 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 报告的类似问题。
有没有人偶然发现这样的问题并找到了一个不错的解决方法?
编辑:我做了更多调查,我删除Locals
了 Mock 并在模拟时遇到了同样的错误Globals
。然后我删除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$MockitoMock$149288076!
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)
...
解决方案
好的,我发现了问题:我正在调用
Mockito.framework().clearInlineMocks();
在@After
注释调用的代码中,但正确的方法是在@AfterClass
注释调用的代码中执行此操作,否则在清除模拟后运行 Mockito 自己的验证。
推荐阅读
- html - CSS calc 函数不居中
- amazon-web-services - 具有内部负载平衡可见性的实例可以在 VPC 之外发送数据吗?
- asp.net-core - Cookie 身份验证无法与 JWT 身份验证 ASP.NET CORE 一起正常工作
- postgresql - 有没有办法在 Hasura graphql 自定义 sql 函数中返回没有表名的 SETOF
- reactjs - 从地图函数返回对象时出现意外的令牌错误 - reactjs
- windows - 缓冲数据会提高 IStream 中的写入性能吗?
- javascript - 如何使用 JavaScript 设置当前时间 datetime-local 值
- python - 使用多线程下载文件时内存不断增长
- swift - Swift Geocode 失败并出现错误:Error Domain=kCLErrorDomain Code=8 "(null)"
- flutter - 初始化initstate时如何聚焦文本字段