Groovy 3.0.5 несовместим с Mockito 3.6.28? Моки нельзя использовать

Я сейчас пытаюсь переехать изJunit 4Mockito 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 => ОК
  • Запуск этого теста с Java-эквивалентом кода (без Groovy) => ОК
  • Запуск этого теста с Groovy 3.0.5 =>
    • manager.getArticleAt(0) - > java.lang.NullPointerException
    • when(manager.getArticleAt(any(Integer.class))).thenReturn(article) -> Метод вызвал исключение org.mockito.exceptions.misusing.InvalidUseOfMatchersException.
    • менеджер не равен нулю, этоArticleManager$MockitoMocks$

Я тут что-то не так делаю или есть какая-то несовместимость?

Большое тебе спасибо

# groovy mockito mocking
Источник
  • 0
    В более старых версиях groovy вы часто можете использовать .& Вместо ::
  • 0
    Кажется, это работает, но теперь у меня есть следующая ошибка: используемый MockMaker SubclassByteBuddyMockMaker does not support the creation of static mocks Mockito's inline mock maker supports static mocks based on the Instrumentation API. Я погуглил, и мне кажется, я должен использовать mockito-inline вместо mockito-core. Но когда я это делаю, у меня возникает та же проблема, что описана в моем исходном посте.
  • 0
    Я думаю, что NPE - это давняя проблема метаклассов. Вы можете попробовать when (manager.getMetaClass ()). ThenCallRealMethod () или добавить «answer = Answers.CALL_REAL_METHOD» к фиктивной аннотации. Когда-то был плагин совместимости mockito, который исправлял это под капотом.
  • 0
    Что касается сопоставителя, я думаю, что anyInt () - это то, что вы ищете.
  • 0
    Спасибо, я займусь этим в понедельник. Но зачем мне, чтобы мой макет вызывал настоящий метод? Я делаю это только от случая к случаю
Codelisting
за 1 против

Я столкнулся с тем же в своем проекте. Я думаю, что это действительно «старая проблема метакласса», также известная как mockito / mockito # 72 , и я думаю, что это снова происходит с Groovy 3.0, потому что внутренние методы больше не помечены как синтетические . Я сообщил об этом mockito / mockito № 2204 .

РЕДАКТИРОВАТЬ 2021-02-15: Я отправил запрос на перенос, чтобы исправить это. Он был принят и выпущен , поэтому попробуйте еще раз с Mockito v3.7.18.

  • 0
    Итак, из того, что вы говорите, это ошибка, которую следует исправить?
  • 0
    Да, и на самом деле мой запрос на исправление был принят и выпущен сегодня утром. Так что попробуйте свои тесты с Mockito v3.7.18. github.com/mockito/mockito/releases/tag/v3.7.18
Codelisting
Популярные категории
На заметку программисту