java - Groovy 3.0.5 与 Mockito 3.6.28 不兼容吗?模拟不可用
问题描述
我目前正试图Junit 4
Mockito 3.2.4
(主要)从秩序中受益mockStatic
并摆脱PowerMock
迁移出乎意料地顺利,直到我到达测试模拟静态方法。Groovy 2.4.6
,目前正在使用,不支持方法引用运算符::
我现在正在尝试迁移到 Groovy 3.0.5,但我在打开模拟时遇到了问题。这是反映该问题的简单代码:
class Article {
Article() {
}
String getName() {
return "toto"
}
}
class ArticleManager {
private Article article
ArticleManager(Article article) {
this.article = article
}
static int getArticleCount() {
return 5
}
Article getArticleAt(int index) {
return article
}
}
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.mockito.Mock
import org.mockito.MockitoAnnotations
import static org.mockito.Mockito.any
import static org.mockito.Mockito.when
class MockTest {
private AutoCloseable closeable
Article article
@Mock
private ArticleManager manager
@BeforeEach
void setup() {
article = new Article()
closeable = MockitoAnnotations.openMocks(this)
}
@AfterEach
void releaseMocks() throws Exception {
closeable.close()
}
@Test
void testGroovy() {
assert article.getName() == "toto"
assert manager != null
assert manager.getArticleAt(0) == null
when(manager.getArticleAt(any(Integer.class))).thenReturn(article)
assert manager.getArticleAt(0) == article
}
}
- 使用 groovy 2.4.6 运行此测试 => OK
- 使用 Java 等效代码运行此测试(没有 groovy)=> OK
- 使用 groovy 3.0.5 运行此测试 =>
manager.getArticleAt(0) - > java.lang.NullPointerException
when(manager.getArticleAt(any(Integer.class))).thenReturn(article)
-> 方法抛出“org.mockito.exceptions.misusing.InvalidUseOfMatchersException”异常。- manager 不为空,它是一个
ArticleManager$MockitoMocks$
我在这里做错了什么还是存在某种不兼容?
非常感谢
解决方案
我在我的项目中遇到了同样的事情。我认为这确实是“古老的元类问题”,又名mockito/mockito#72,而且我认为它在 Groovy 3.0 中再次发生,因为内部方法不再被标记为 Synthetic。我已经报告了mockito/mockito#2204关于这个。
编辑 2021-02-15:我提交了一个拉取请求来解决这个问题。它已被接受并发布,所以请使用 Mockito v3.7.18 重试。
推荐阅读
- android - 带有子项目的弹出菜单
- app-store-connect - 是否可以选择要使用的试飞版本?
- mysql - Mysql交替排序数据
- c++ - 为什么它拒绝将整数的二进制写入文件?
- c# - 适用于 UWP 应用的 Microsoft 认知语音 SDK
- c# - 我们如何将云锚的过期时间从 24 小时延长
- c++ - 有没有办法在 C++ 编译器中禁用复制省略
- python-3.x - 如何在 for 循环中使用 matplotlib 处理多个数字
- javascript - 识别 Service Worker 缓存中的陈旧缓存条目
- javascript - 如果只移动 1-2 个字符,如何防止 css 破坏单词?