Аннотации JUnit 5 - не работают с LiveData / параметризованными тестами - PullRequest
0 голосов
/ 17 октября 2019

Обзор

Ожидаемое поведение

Замена инициализации фиктивного объекта с использованием реализации mockObject функции с инициализацией синтаксиса аннотации для JUnit 5, как описанов документации и Средний пост от @oleksiyp.

Текущее поведение

Тестречь идет о параметризованном тесте , обозначенном @ phauer для JUnit 5, который, кажется, конфликтует с @ExtendWith(MockKExtension::class). Чтобы реализовать тесты с LiveData, тест должен выполняться синхронно в локальном модульном тесте с использованием этого InstantExecutorExtension, разработанного @JeroenMols.

Инициализация ложного объекта работает какожидается с функцией mockObject, но не с использованием аннотации @MockK.

Ошибка

Предупреждающее сообщение / Ошибка сборки:

Повторяющиеся аннотации с ненастроеннымиСохранение SOURCE пока не поддерживается.

Реализация

mockObject Реализация функции (работает должным образом)

@ExtendWith(InstantExecutorExtension::class)
class NavigateContentTests {
    private val mainThreadSurrogate = newSingleThreadContext("UI thread")
    private val contentViewModel = ContentViewModel()

    // This is the stream of tests to run in the Parameterized test below.
    private fun NavigateContent() = Stream.of(
            NavigateContentTest(
                    isRealtime = false,
                    feedType = MAIN,
                    timeframe = DAY,
                    mockFeedList = mockDbContentListForDay,
                    mockContent = mockArticleContent),
            ...)

    @BeforeAll
    fun beforeAll() { mockkObject(ContentRepository) }

    @AfterAll
    fun afterAll() { unmockkAll() // Re-assigns transformation of object to original state prior to mock. }

    @BeforeEach
    fun beforeEach() { Dispatchers.setMain(mainThreadSurrogate) }

    @AfterEach
    fun afterEach() {
        Dispatchers.resetMain() // Reset main dispatcher to the original Main dispatcher.
        mainThreadSurrogate.close()
    }

    @ParameterizedTest
    @MethodSource("NavigateContent")
    fun `Navigate Content`(test: NavigateContentTest) = runBlocking {
        every { ContentRepository.getMainFeedList(test.isRealtime, any()) } returns mockGetMainFeedList(
                test.mockFeedList, CONTENT)
        every {
            ContentRepository.queryLabeledContentList(test.feedType)
        } returns mockQueryMainContentList(test.mockFeedList)
        every { ContentRepository.getContent(test.mockContent.id) } returns mockGetContent(test)
        // Tests here...
        // Verification here...
    }
}

Инициализация синтаксиса аннотации (не работает из-за двух расширений @ExtendWith)

@ExtendWith(InstantExecutorExtension::class)
@ExtendWith(MockKExtension::class)
class NavigateContentTests {

    // This object should be mocked.
    @MockK
    lateinit var contentRepository: ContentRepository

    private val mainThreadSurrogate = newSingleThreadContext("UI thread")
    private val contentViewModel = ContentViewModel()

    // This is the stream of tests to run in the Parameterized test below.
    private fun NavigateContent() = Stream.of(
            NavigateContentTest(
                    isRealtime = false,
                    feedType = MAIN,
                    timeframe = DAY,
                    mockFeedList = mockDbContentListForDay,
                    mockContent = mockArticleContent),
            ...)

    @BeforeAll
    fun beforeAll() {  MockKAnnotations.init(this, relaxUnitFun = true) // turn relaxUnitFun on for }

    @AfterAll
    fun afterAll() { unmockkAll() // Re-assigns transformation of object to original state prior to mock. }

    @BeforeEach
    fun beforeEach() { Dispatchers.setMain(mainThreadSurrogate) }

    @AfterEach
    fun afterEach() {
        Dispatchers.resetMain() // Reset main dispatcher to the original Main dispatcher.
        mainThreadSurrogate.close()
    }

    @ParameterizedTest
    @MethodSource("NavigateContent")
    fun `Navigate Content`(test: NavigateContentTest) = runBlocking {
        every { contentRepository.getMainFeedList(test.isRealtime, any()) } returns mockGetMainFeedList(
                test.mockFeedList, CONTENT)
        every {
            contentRepository.queryLabeledContentList(test.feedType)
        } returns mockQueryMainContentList(test.mockFeedList)
        every { contentRepository.getContent(test.mockContent.id) } returns mockGetContent(test)
        // Tests here...
        // Verification here...
    }
}

Среда

  • Версия MockK: 1.9.3
  • ОС: Mac 10.14.6
  • Версия Kotlin: 1.3.50
  • Версия JDK: 12.0.1
  • Версия JUnit: 5.5.1
  • Тип теста: Юнит тест

1 Ответ

0 голосов
/ 03 ноября 2019

Это ошибка в соответствии с этой проблемой GitHub , как задокументировано создателем MockK, @ oleksiy .

Я обновлю этот пост, как только увижу, что ошибка устранена.

...