首页 > 解决方案 > 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
    }
}

我在这里做错了什么还是存在某种不兼容?

非常感谢

标签: javagroovymockingmockito

解决方案


我在我的项目中遇到了同样的事情。我认为这确实是“古老的元类问题”,又名mockito/mockito#72,而且我认为它在 Groovy 3.0 中再次发生,因为内部方法不再被标记为 Synthetic。我已经报告了mockito/mockito#2204关于这个。

编辑 2021-02-15:我提交了一个拉取请求来解决这个问题。它已被接受发布,所以请使用 Mockito v3.7.18 重试。


推荐阅读