From ff9954f40018de56da7ee46cfd47d0ba930b6768 Mon Sep 17 00:00:00 2001 From: Ilia Bogdanovich Date: Wed, 14 Aug 2024 11:45:09 +0200 Subject: [PATCH] =?UTF-8?q?[mockito.kotlin=20=E2=86=92=20mockk]=20Migrated?= =?UTF-8?q?=20intellij.vcs.github=20tests=20from=20mockito.kotlin=20to=20m?= =?UTF-8?q?ockk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GitOrigin-RevId: 32df0857285bf8d5dd7f4182bdc740eebfc2e46c --- plugins/github/intellij.vcs.github.iml | 4 +- .../GHPRChangesDataProviderImplTest.kt | 40 +++---- .../GHPRCommentsDataProviderImplTest.kt | 51 ++++---- .../GHPRDetailsDataProviderImplTest.kt | 110 +++++++++--------- .../GHPRReviewDataProviderImplTest.kt | 85 ++++++-------- .../GHPRViewedStateDataProviderImplTest.kt | 26 ++--- 6 files changed, 139 insertions(+), 177 deletions(-) diff --git a/plugins/github/intellij.vcs.github.iml b/plugins/github/intellij.vcs.github.iml index 0a8c6d86bfe3..d5bb078d1771 100644 --- a/plugins/github/intellij.vcs.github.iml +++ b/plugins/github/intellij.vcs.github.iml @@ -79,8 +79,8 @@ - - + + \ No newline at end of file diff --git a/plugins/github/test/org/jetbrains/plugins/github/pullrequest/data/provider/GHPRChangesDataProviderImplTest.kt b/plugins/github/test/org/jetbrains/plugins/github/pullrequest/data/provider/GHPRChangesDataProviderImplTest.kt index 302b1d2e9b66..6ef99418e0e2 100644 --- a/plugins/github/test/org/jetbrains/plugins/github/pullrequest/data/provider/GHPRChangesDataProviderImplTest.kt +++ b/plugins/github/test/org/jetbrains/plugins/github/pullrequest/data/provider/GHPRChangesDataProviderImplTest.kt @@ -6,6 +6,7 @@ import com.intellij.collaboration.util.ComputedResult import com.intellij.collaboration.util.FlowTestUtil.assertEmits import com.intellij.collaboration.util.MainDispatcherRule import git4idea.changes.GitBranchComparisonResult +import io.mockk.* import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.delay import kotlinx.coroutines.test.TestScope @@ -18,12 +19,7 @@ import org.jetbrains.plugins.github.pullrequest.data.GHPRIdentifier import org.jetbrains.plugins.github.pullrequest.data.service.GHPRChangesService import org.junit.Assert.assertEquals import org.junit.ClassRule -import org.junit.Rule import org.junit.Test -import org.mockito.Mock -import org.mockito.junit.MockitoJUnit -import org.mockito.junit.MockitoRule -import org.mockito.kotlin.* import java.util.* import kotlin.time.Duration.Companion.seconds @@ -37,12 +33,7 @@ class GHPRChangesDataProviderImplTest { internal val mainRule = MainDispatcherRule() } - @Rule - @JvmField - internal val mockitoRule: MockitoRule = MockitoJUnit.rule() - - @Mock - internal lateinit var changesService: GHPRChangesService + private val changesService = mockk() private fun TestScope.createProvider(refs: GHPRBranchesRefs): GHPRChangesDataProvider = GHPRChangesDataProviderImpl(backgroundScope, changesService, { refs }, PR_ID) @@ -52,18 +43,19 @@ class GHPRChangesDataProviderImplTest { val refs = GHPRBranchesRefs("b", "h") val mergeBaseRef = "mb" - val result = mock() - whenever(changesService.loadCommitsFromApi(PR_ID)) doReturn createMockCommits(refs.headRef) - whenever(changesService.loadMergeBaseOid(any(), any())) doReturn mergeBaseRef - whenever(changesService.createChangesProvider(eq(PR_ID), any(), any(), any(), any())) doReturn result - + val result = mockk() + coEvery { changesService.loadCommitsFromApi(PR_ID) } returns createMockCommits(refs.headRef) + coEvery { changesService.loadMergeBaseOid(any(), any()) } returns mergeBaseRef + coEvery { changesService.createChangesProvider(eq(PR_ID), any(), any(), any(), any()) } returns result val inst = createProvider(refs) assertEquals(inst.loadChanges(), inst.loadChanges()) assertEquals(inst.loadCommits(), inst.loadCommits()) - verify(changesService, times(1)).loadCommitsFromApi(eq(PR_ID)) - verify(changesService, times(1)).createChangesProvider(eq(PR_ID), eq(refs.baseRef), eq(mergeBaseRef), eq(refs.headRef), any()) + coVerify(exactly = 1) { + changesService.loadCommitsFromApi(eq(PR_ID)) + changesService.createChangesProvider(eq(PR_ID), eq(refs.baseRef), eq(mergeBaseRef), eq(refs.headRef), any()) + } } @OptIn(ExperimentalCoroutinesApi::class) @@ -72,12 +64,12 @@ class GHPRChangesDataProviderImplTest { val refs = GHPRBranchesRefs("b", "h") val mergeBaseRef = "mb" - whenever(changesService.loadCommitsFromApi(PR_ID)) doReturn createMockCommits(refs.headRef) - whenever(changesService.loadMergeBaseOid(any(), any())) doReturn mergeBaseRef + coEvery { changesService.loadCommitsFromApi(PR_ID) } returns createMockCommits(refs.headRef) + coEvery { changesService.loadMergeBaseOid(any(), any()) } returns mergeBaseRef - val result = mock() + val result = mockk() var counter = 0 - whenever(changesService.createChangesProvider(eq(PR_ID), any(), any(), any(), any())) doSuspendableAnswer { + coEvery { changesService.createChangesProvider(eq(PR_ID), any(), any(), any(), any()) } coAnswers { if (counter == 0) { delay(1.seconds) throw EXCEPTION @@ -117,8 +109,8 @@ private fun createMockCommits(headRef: String): List { url = "mockUrl$i", messageHeadline = "Mock Commit Headline $i", messageBody = "Mock Commit Body $i", - author = mock(), - committer = mock(), + author = mockk(), + committer = mockk(), committedDate = Date(), parents = mockParents ) diff --git a/plugins/github/test/org/jetbrains/plugins/github/pullrequest/data/provider/GHPRCommentsDataProviderImplTest.kt b/plugins/github/test/org/jetbrains/plugins/github/pullrequest/data/provider/GHPRCommentsDataProviderImplTest.kt index 5b2af8af716b..725e96864fe5 100644 --- a/plugins/github/test/org/jetbrains/plugins/github/pullrequest/data/provider/GHPRCommentsDataProviderImplTest.kt +++ b/plugins/github/test/org/jetbrains/plugins/github/pullrequest/data/provider/GHPRCommentsDataProviderImplTest.kt @@ -2,18 +2,13 @@ package org.jetbrains.plugins.github.pullrequest.data.provider import com.intellij.collaboration.util.MainDispatcherRule import com.intellij.util.messages.MessageBus +import io.mockk.* import kotlinx.coroutines.test.runTest import org.jetbrains.plugins.github.api.data.GHComment import org.jetbrains.plugins.github.pullrequest.data.GHPRIdentifier import org.jetbrains.plugins.github.pullrequest.data.service.GHPRCommentService -import org.junit.Before import org.junit.ClassRule -import org.junit.Rule import org.junit.Test -import org.mockito.Mock -import org.mockito.junit.MockitoJUnit -import org.mockito.junit.MockitoRule -import org.mockito.kotlin.* import java.util.* class GHPRCommentsDataProviderImplTest { @@ -25,35 +20,25 @@ class GHPRCommentsDataProviderImplTest { internal val mainRule = MainDispatcherRule() } - @Rule - @JvmField - internal val mockitoRule: MockitoRule = MockitoJUnit.rule() - - @Mock - internal lateinit var commentsService: GHPRCommentService - - @Mock - internal lateinit var messageBus: MessageBus - - @Mock - internal lateinit var listener: GHPRDataOperationsListener + private val commentsService = mockk(relaxed = true) + private val listener = mockk(relaxUnitFun = true) + private val messageBus = mockk { + every { syncPublisher(GHPRDataOperationsListener.TOPIC) } returns listener + } private fun createProvider(): GHPRCommentsDataProvider = GHPRCommentsDataProviderImpl(commentsService, PR_ID, messageBus) - @Before - fun setUp() { - whenever(messageBus.syncPublisher(GHPRDataOperationsListener.TOPIC)) doReturn listener - } - @Test fun testAddComment() = runTest { val body = "test" val prv = createProvider() prv.addComment(body) - verify(commentsService, times(1)).addComment(eq(PR_ID), eq(body)) - verify(listener, times(1)).onCommentAdded() + coVerifyAll { + commentsService.addComment(eq(PR_ID), eq(body)) + listener.onCommentAdded() + } } @Test @@ -61,12 +46,14 @@ class GHPRCommentsDataProviderImplTest { val id = "id" val body = "test" - whenever(commentsService.updateComment(eq(id), any())) doReturn GHComment("", null, body, Date(), mock()) + coEvery { commentsService.updateComment(eq(id), any()) } returns GHComment("", null, body, Date(), mockk()) val prv = createProvider() prv.updateComment(id, body) - verify(commentsService, times(1)).updateComment(eq(id), eq(body)) - verify(listener, times(1)).onCommentUpdated(eq(id), eq(body)) + coVerifyAll { + commentsService.updateComment(eq(id), eq(body)) + listener.onCommentUpdated(eq(id), eq(body)) + } } @Test @@ -74,7 +61,9 @@ class GHPRCommentsDataProviderImplTest { val id = "id" val prv = createProvider() prv.deleteComment(id) - verify(commentsService, times(1)).deleteComment(eq(id)) - verify(listener, times(1)).onCommentDeleted(eq(id)) + coVerifyAll { + commentsService.deleteComment(eq(id)) + listener.onCommentDeleted(eq(id)) + } } -} \ No newline at end of file +} diff --git a/plugins/github/test/org/jetbrains/plugins/github/pullrequest/data/provider/GHPRDetailsDataProviderImplTest.kt b/plugins/github/test/org/jetbrains/plugins/github/pullrequest/data/provider/GHPRDetailsDataProviderImplTest.kt index b03af5f77ccb..78acb06f207b 100644 --- a/plugins/github/test/org/jetbrains/plugins/github/pullrequest/data/provider/GHPRDetailsDataProviderImplTest.kt +++ b/plugins/github/test/org/jetbrains/plugins/github/pullrequest/data/provider/GHPRDetailsDataProviderImplTest.kt @@ -5,6 +5,10 @@ import com.intellij.collaboration.util.ComputedResult import com.intellij.collaboration.util.FlowTestUtil.assertEmits import com.intellij.collaboration.util.MainDispatcherRule import com.intellij.util.messages.MessageBus +import io.mockk.coEvery +import io.mockk.coVerifyAll +import io.mockk.every +import io.mockk.mockk import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.delay import kotlinx.coroutines.test.TestScope @@ -16,16 +20,10 @@ import org.jetbrains.plugins.github.pullrequest.data.GHPRIdentifier import org.jetbrains.plugins.github.pullrequest.data.GHPRMergeabilityState import org.jetbrains.plugins.github.pullrequest.data.service.GHPRDetailsService import org.junit.Assert.assertEquals -import org.junit.Before import org.junit.ClassRule -import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.junit.runners.JUnit4 -import org.mockito.Mock -import org.mockito.junit.MockitoJUnit -import org.mockito.junit.MockitoRule -import org.mockito.kotlin.* import kotlin.time.Duration.Companion.seconds private val PR_ID = GHPRIdentifier("id", 0) @@ -40,30 +38,18 @@ class GHPRDetailsDataProviderImplTest { internal val mainRule = MainDispatcherRule() } - @Rule - @JvmField - internal val mockitoRule: MockitoRule = MockitoJUnit.rule() - - @Mock - internal lateinit var detailsService: GHPRDetailsService - - @Mock - internal lateinit var messageBus: MessageBus - - @Mock - internal lateinit var listener: GHPRDataOperationsListener - - @Before - internal fun setup() { - whenever(messageBus.syncPublisher(GHPRDataOperationsListener.TOPIC)) doReturn listener + private val detailsService = mockk(relaxUnitFun = true) + private val listener = mockk(relaxUnitFun = true) + private val messageBus = mockk { + every { syncPublisher(GHPRDataOperationsListener.TOPIC) } returns listener } private fun TestScope.createProvider() = GHPRDetailsDataProviderImpl(backgroundScope, detailsService, PR_ID, messageBus) @Test fun testCachingDetailsLoad() = runTest { - val result = mock() - whenever(detailsService.loadDetails(PR_ID)) doReturn result + val result = mockk() + coEvery { detailsService.loadDetails(PR_ID) } returns result val inst = createProvider() assertEquals(inst.loadDetails(), result) @@ -71,12 +57,14 @@ class GHPRDetailsDataProviderImplTest { assertEquals(inst.loadDetails(), result) assertEquals(inst.loadedDetails, result) - verify(detailsService, times(1)).loadDetails(PR_ID) + coVerifyAll { + detailsService.loadDetails(PR_ID) + } } @Test fun testDetailsErrorLoad() = runTest { - whenever(detailsService.loadDetails(PR_ID)) doThrow EXCEPTION + coEvery { detailsService.loadDetails(PR_ID) } throws EXCEPTION val inst = createProvider() runCatching { @@ -85,14 +73,14 @@ class GHPRDetailsDataProviderImplTest { assertEquals(EXCEPTION, exceptionOrNull()) } - verify(detailsService, times(1)).loadDetails(PR_ID) + coVerifyAll { detailsService.loadDetails(PR_ID) } } @Test fun testDetailsReloadAfterError() = runTest { - val result = mock() + val result = mockk() var counter = 0 - whenever(detailsService.loadDetails(PR_ID)) doSuspendableAnswer { + coEvery { detailsService.loadDetails(PR_ID) } coAnswers { if (counter == 0) { throw EXCEPTION } @@ -107,41 +95,46 @@ class GHPRDetailsDataProviderImplTest { inst.signalDetailsNeedReload() runCatching { inst.loadDetails() }.apply { assertEquals(result, getOrThrow()) } - verify(detailsService, times(2)).loadDetails(PR_ID) + coVerifyAll { + detailsService.loadDetails(PR_ID) + detailsService.loadDetails(PR_ID) + } } @Test fun testUpdate() = runTest { - val result1 = mock() - val result2 = mock() - whenever(detailsService.loadDetails(PR_ID)) doReturn result1 - whenever(detailsService.updateDetails(eq(PR_ID), any(), any())) doReturn result2 + val result1 = mockk() + val result2 = mockk() + coEvery { detailsService.loadDetails(PR_ID) } returns result1 + coEvery { detailsService.updateDetails(eq(PR_ID), any(), any()) } returns result2 val inst = createProvider() assertEquals(inst.loadDetails(), result1) inst.updateDetails("", "") assertEquals(inst.loadDetails(), result2) - verify(detailsService, times(1)).updateDetails(eq(PR_ID), any(), any()) - verify(detailsService, times(1)).loadDetails(PR_ID) - verify(listener, times(1)).onMetadataChanged() + coVerifyAll { + detailsService.updateDetails(eq(PR_ID), any(), any()) + detailsService.loadDetails(PR_ID) + listener.onMetadataChanged() + } } @Test fun testCachingMergeabilityLoad() = runTest { - val result = mock() - whenever(detailsService.loadMergeabilityState(PR_ID)) doReturn result + val result = mockk() + coEvery { detailsService.loadMergeabilityState(PR_ID) } returns result val inst = createProvider() assertEquals(inst.loadMergeabilityState(), result) assertEquals(inst.loadMergeabilityState(), result) - verify(detailsService, times(1)).loadMergeabilityState(PR_ID) + coVerifyAll { detailsService.loadMergeabilityState(PR_ID) } } @Test fun testMergeabilityErrorLoad() = runTest { - whenever(detailsService.loadMergeabilityState(PR_ID)) doThrow EXCEPTION + coEvery { detailsService.loadMergeabilityState(PR_ID) } throws EXCEPTION val inst = createProvider() runCatching { @@ -150,14 +143,14 @@ class GHPRDetailsDataProviderImplTest { assertEquals(EXCEPTION, exceptionOrNull()) } - verify(detailsService, times(1)).loadMergeabilityState(PR_ID) + coVerifyAll { detailsService.loadMergeabilityState(PR_ID) } } @Test fun testMergeabilityReloadAfterError() = runTest { - val result = mock() + val result = mockk() var counter = 0 - whenever(detailsService.loadMergeabilityState(PR_ID)) doSuspendableAnswer { + coEvery { detailsService.loadMergeabilityState(PR_ID) } coAnswers { if (counter == 0) { throw EXCEPTION } @@ -172,17 +165,21 @@ class GHPRDetailsDataProviderImplTest { inst.signalMergeabilityNeedsReload() runCatching { inst.loadMergeabilityState() }.apply { assertEquals(result, getOrThrow()) } - verify(detailsService, times(2)).loadMergeabilityState(PR_ID) + coVerifyAll { + detailsService.loadMergeabilityState(PR_ID) + detailsService.loadMergeabilityState(PR_ID) + } } @Test fun testReviewers() = runTest { val inst = createProvider() - inst.adjustReviewers(mock()) + inst.adjustReviewers(mockk()) - verify(detailsService, never()).loadDetails(PR_ID) - verify(detailsService, times(1)).adjustReviewers(eq(PR_ID), any()) - verify(listener, times(1)).onMetadataChanged() + coVerifyAll { + detailsService.adjustReviewers(eq(PR_ID), any()) + listener.onMetadataChanged() + } } @Test @@ -190,17 +187,18 @@ class GHPRDetailsDataProviderImplTest { val inst = createProvider() inst.close() - verify(detailsService, never()).loadDetails(PR_ID) - verify(detailsService, times(1)).close(PR_ID) - verify(listener, times(1)).onMetadataChanged() + coVerifyAll { + detailsService.close(eq(PR_ID)) + listener.onMetadataChanged() + } } @OptIn(ExperimentalCoroutinesApi::class) @Test fun testDetailsFlow() = runTest(UnconfinedTestDispatcher()) { - val result = mock() + val result = mockk() var counter = 0 - whenever(detailsService.loadDetails(PR_ID)) doSuspendableAnswer { + coEvery { detailsService.loadDetails(PR_ID) } coAnswers { if (counter == 0) { delay(1.seconds) throw EXCEPTION @@ -225,9 +223,9 @@ class GHPRDetailsDataProviderImplTest { @OptIn(ExperimentalCoroutinesApi::class) @Test fun testMergeabilityFlow() = runTest(UnconfinedTestDispatcher()) { - val result = mock() + val result = mockk() var counter = 0 - whenever(detailsService.loadMergeabilityState(PR_ID)) doSuspendableAnswer { + coEvery { detailsService.loadMergeabilityState(PR_ID) } coAnswers { if (counter == 0) { delay(1.seconds) throw EXCEPTION diff --git a/plugins/github/test/org/jetbrains/plugins/github/pullrequest/data/provider/GHPRReviewDataProviderImplTest.kt b/plugins/github/test/org/jetbrains/plugins/github/pullrequest/data/provider/GHPRReviewDataProviderImplTest.kt index 71698b5ba3d1..8514ef9866f7 100644 --- a/plugins/github/test/org/jetbrains/plugins/github/pullrequest/data/provider/GHPRReviewDataProviderImplTest.kt +++ b/plugins/github/test/org/jetbrains/plugins/github/pullrequest/data/provider/GHPRReviewDataProviderImplTest.kt @@ -4,6 +4,7 @@ package org.jetbrains.plugins.github.pullrequest.data.provider import com.intellij.collaboration.api.dto.GraphQLNodesDTO import com.intellij.collaboration.util.MainDispatcherRule import com.intellij.util.messages.MessageBus +import io.mockk.* import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.runTest import org.jetbrains.plugins.github.api.data.pullrequest.GHPullRequestPendingReviewDTO @@ -13,16 +14,10 @@ import org.jetbrains.plugins.github.api.data.pullrequest.GHPullRequestReviewThre import org.jetbrains.plugins.github.pullrequest.data.GHPRIdentifier import org.jetbrains.plugins.github.pullrequest.data.service.GHPRReviewService import org.junit.Assert.assertEquals -import org.junit.Before import org.junit.ClassRule -import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.junit.runners.JUnit4 -import org.mockito.Mock -import org.mockito.junit.MockitoJUnit -import org.mockito.junit.MockitoRule -import org.mockito.kotlin.* private val PR_ID = GHPRIdentifier("id", 0) @@ -36,74 +31,64 @@ class GHPRReviewDataProviderImplTest { internal val mainRule = MainDispatcherRule() } - @Rule - @JvmField - internal val mockitoRule: MockitoRule = MockitoJUnit.rule() - - @Mock - internal lateinit var reviewService: GHPRReviewService - - @Mock - internal lateinit var messageBus: MessageBus - - @Mock - internal lateinit var listener: GHPRDataOperationsListener + private val reviewService = mockk(relaxUnitFun = true) + private val listener = mockk(relaxUnitFun = true) + private val messageBus = mockk { + every { syncPublisher(GHPRDataOperationsListener.TOPIC) } returns listener + } private fun TestScope.createProvider(): GHPRReviewDataProvider = - GHPRReviewDataProviderImpl(backgroundScope, reviewService, mock(), PR_ID, messageBus) + GHPRReviewDataProviderImpl(backgroundScope, reviewService, mockk(), PR_ID, messageBus) private fun createPendingReview(id: String, comments: List): GHPullRequestPendingReviewDTO = GHPullRequestPendingReviewDTO(id, GHPullRequestReviewState.PENDING, GraphQLNodesDTO(comments, comments.size)) - @Before - fun setUp() { - whenever(messageBus.syncPublisher(GHPRDataOperationsListener.TOPIC)) doReturn listener - } - @Test fun testCachingReviewLoad() = runTest { - whenever(reviewService.loadPendingReview(PR_ID)) doReturn createPendingReview("", listOf(mock())) + coEvery { reviewService.loadPendingReview(eq(PR_ID)) } returns createPendingReview("", listOf(mockk())) val prv = createProvider() val result = prv.loadPendingReview() assertEquals(prv.loadPendingReview(), result) - verify(reviewService, times(1)).loadPendingReview(PR_ID) + coVerifyAll { reviewService.loadPendingReview(PR_ID) } } @Test fun testCreateAndSubmitReview() = runTest { - whenever(reviewService.loadPendingReview(eq(PR_ID))) doReturn null - whenever(reviewService.createReview(eq(PR_ID), anyOrNull(), anyOrNull(), anyOrNull(), anyOrNull())) doReturn - createPendingReview("", listOf(mock())) + coEvery { reviewService.loadPendingReview(eq(PR_ID)) } returns null + coEvery { reviewService.createReview(eq(PR_ID), any(), any(), any(), any()) } returns createPendingReview("", listOf(mockk())) val prv = createProvider() - prv.createReview(mock(), "test") - verify(reviewService, times(1)).createReview(eq(PR_ID), anyOrNull(), anyOrNull(), anyOrNull(), anyOrNull()) + prv.createReview(mockk(), "test") + coVerify { reviewService.createReview(eq(PR_ID), any(), any(), any(), any()) } assertEquals(prv.loadPendingReview(), null) - verify(reviewService, times(1)).loadPendingReview(PR_ID) + coVerify { reviewService.loadPendingReview(PR_ID) } + confirmVerified(reviewService) } @Test fun testCreatePendingReviewImmediateUpdate() = runTest { - val result = createPendingReview("", listOf(mock())) - whenever(reviewService.createReview(eq(PR_ID), anyOrNull(), anyOrNull(), anyOrNull(), anyOrNull())) doReturn result + val result = createPendingReview("", listOf(mockk())) + coEvery { reviewService.createReview(eq(PR_ID), any(), any(), any(), any()) } returns result val prv = createProvider() prv.createReview(null, "test") - verify(reviewService, times(1)).createReview(eq(PR_ID), anyOrNull(), anyOrNull(), anyOrNull(), anyOrNull()) - verify(listener, times(1)).onReviewsChanged() + coVerifyAll { + reviewService.createReview(eq(PR_ID), any(), any(), any(), any()) + listener.onReviewsChanged() + } assertEquals(result.toModel(), prv.loadPendingReview()) - verify(reviewService, never()).loadPendingReview(PR_ID) + confirmVerified(reviewService) } @Test fun testDeleteReviewUpdatedImmediately() = runTest { - val reviewDto = createPendingReview("REVIEW", listOf(mock())) + val reviewDto = createPendingReview("REVIEW", listOf(mockk())) - whenever(reviewService.loadPendingReview(eq(PR_ID))) doReturn reviewDto + coEvery { reviewService.loadPendingReview(eq(PR_ID)) } returns reviewDto val prv = createProvider() // fill cache @@ -111,9 +96,11 @@ class GHPRReviewDataProviderImplTest { prv.deleteReview(reviewDto.id) assertEquals(null, prv.loadPendingReview()) - verify(reviewService, times(1)).loadPendingReview(eq(PR_ID)) - verify(reviewService, times(1)).deleteReview(eq(PR_ID), eq(reviewDto.id)) - verify(listener, times(1)).onReviewsChanged() + coVerifySequence { + reviewService.loadPendingReview(eq(PR_ID)) + reviewService.deleteReview(eq(PR_ID), eq(reviewDto.id)) + listener.onReviewsChanged() + } } @Test @@ -121,24 +108,26 @@ class GHPRReviewDataProviderImplTest { val reviewId = "REVIEW" val text = "test" - whenever(reviewService.updateReviewBody(eq(reviewId), eq(text))) doReturn mock() + coEvery { reviewService.updateReviewBody(eq(reviewId), eq(text)) } returns mockk(relaxed = true) val prv = createProvider() prv.updateReviewBody(reviewId, text) - verify(reviewService, times(1)).updateReviewBody(eq(reviewId), eq(text)) - verify(listener, times(1)).onReviewUpdated(eq(reviewId), eq(text)) + coVerifySequence { + reviewService.updateReviewBody(eq(reviewId), eq(text)) + listener.onReviewUpdated(eq(reviewId), eq(text)) + } } @Test fun testCachingThreadsLoad() = runTest { - val result = mock>() - whenever(reviewService.loadReviewThreads(PR_ID)) doReturn result + val result = mockk>() + coEvery { reviewService.loadReviewThreads(PR_ID) } returns result val prv = createProvider() assertEquals(prv.loadThreads(), result) assertEquals(prv.loadThreads(), result) - verify(reviewService, times(1)).loadReviewThreads(PR_ID) + coVerifyAll { reviewService.loadReviewThreads(PR_ID) } } } \ No newline at end of file diff --git a/plugins/github/test/org/jetbrains/plugins/github/pullrequest/data/provider/GHPRViewedStateDataProviderImplTest.kt b/plugins/github/test/org/jetbrains/plugins/github/pullrequest/data/provider/GHPRViewedStateDataProviderImplTest.kt index b6931d190dea..1369e2fc58b7 100644 --- a/plugins/github/test/org/jetbrains/plugins/github/pullrequest/data/provider/GHPRViewedStateDataProviderImplTest.kt +++ b/plugins/github/test/org/jetbrains/plugins/github/pullrequest/data/provider/GHPRViewedStateDataProviderImplTest.kt @@ -4,6 +4,10 @@ import com.intellij.collaboration.async.launchNow import com.intellij.collaboration.util.ComputedResult import com.intellij.collaboration.util.FlowTestUtil.assertEmits import com.intellij.collaboration.util.MainDispatcherRule +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.coVerifyAll +import io.mockk.mockk import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.delay import kotlinx.coroutines.flow.first @@ -17,12 +21,7 @@ import org.jetbrains.plugins.github.pullrequest.data.GHPRIdentifier import org.jetbrains.plugins.github.pullrequest.data.service.GHPRFilesService import org.junit.Assert.assertEquals import org.junit.ClassRule -import org.junit.Rule import org.junit.Test -import org.mockito.Mock -import org.mockito.junit.MockitoJUnit -import org.mockito.junit.MockitoRule -import org.mockito.kotlin.* import kotlin.time.Duration.Companion.milliseconds import kotlin.time.Duration.Companion.seconds @@ -36,12 +35,7 @@ class GHPRViewedStateDataProviderImplTest { internal val mainRule = MainDispatcherRule() } - @Rule - @JvmField - internal val mockitoRule: MockitoRule = MockitoJUnit.rule() - - @Mock - internal lateinit var filesService: GHPRFilesService + private val filesService = mockk() private fun TestScope.createProvider(): GHPRViewedStateDataProvider = GHPRViewedStateDataProviderImpl(backgroundScope, filesService, PR_ID) @@ -49,17 +43,17 @@ class GHPRViewedStateDataProviderImplTest { @Test fun testCachingStateLoad() = runTest { val result = emptyList() - whenever(filesService.loadFiles(PR_ID)) doReturn result + coEvery { filesService.loadFiles(PR_ID) } returns result val inst = createProvider() assertEquals(inst.loadViewedState(), inst.loadViewedState()) - verify(filesService, times(1)).loadFiles(eq(PR_ID)) + coVerifyAll { filesService.loadFiles(eq(PR_ID)) } } @Test fun testReloadOnError() = runTest { - whenever(filesService.updateViewedState(eq(PR_ID), any(), any())) doThrow EXCEPTION + coEvery { filesService.updateViewedState(eq(PR_ID), any(), any()) } throws EXCEPTION val inst = createProvider() val signalAwaiter = launchNow { @@ -71,7 +65,7 @@ class GHPRViewedStateDataProviderImplTest { signalAwaiter.join() } - verify(filesService, atLeastOnce()).updateViewedState(eq(PR_ID), any(), any()) + coVerify { filesService.updateViewedState(eq(PR_ID), any(), any()) } } @OptIn(ExperimentalCoroutinesApi::class) @@ -79,7 +73,7 @@ class GHPRViewedStateDataProviderImplTest { fun testChangesFlow() = runTest(UnconfinedTestDispatcher()) { val result = emptyList() var counter = 0 - whenever(filesService.loadFiles(eq(PR_ID))) doSuspendableAnswer { + coEvery { filesService.loadFiles(eq(PR_ID)) } coAnswers { if (counter == 0) { delay(1.seconds) throw EXCEPTION