From 12d5e680bc87ddc4bab0edd0c5e6286257664b44 Mon Sep 17 00:00:00 2001 From: cmathew Date: Fri, 27 Oct 2023 11:29:13 -0700 Subject: [PATCH 1/2] use mockk to better support kotlin --- magellan-sample-migration/build.gradle | 2 +- .../sample/migration/TestDogApiModule.kt | 4 ++-- .../sample/migration/TestExtensions.kt | 10 ++------- .../migration/TestToolbarHelperModule.kt | 4 ++-- .../migration/tide/DogDetailsScreenTest.kt | 19 +++++----------- .../migration/tide/DogDetailsViewTest.kt | 22 ++++++------------- .../sample/migration/tide/DogListStepTest.kt | 6 ++--- 7 files changed, 23 insertions(+), 44 deletions(-) diff --git a/magellan-sample-migration/build.gradle b/magellan-sample-migration/build.gradle index 6a09fb95..f0a01f16 100644 --- a/magellan-sample-migration/build.gradle +++ b/magellan-sample-migration/build.gradle @@ -70,7 +70,7 @@ dependencies { testImplementation Libs.junit testImplementation Libs.testCore testImplementation Libs.truth - testImplementation Libs.mockito + testImplementation Libs.mockK testImplementation Libs.robolectric testImplementation Libs.truth diff --git a/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/TestDogApiModule.kt b/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/TestDogApiModule.kt index 895a3089..e880dc2e 100644 --- a/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/TestDogApiModule.kt +++ b/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/TestDogApiModule.kt @@ -3,7 +3,7 @@ package com.wealthfront.magellan.sample.migration import com.wealthfront.magellan.sample.migration.api.DogApi import dagger.Module import dagger.Provides -import org.mockito.Mockito +import io.mockk.mockk import javax.inject.Singleton @Module @@ -12,6 +12,6 @@ object TestDogApiModule { @Provides @Singleton fun provideDogApi(): DogApi { - return Mockito.mock(DogApi::class.java) + return mockk(relaxed = true) } } diff --git a/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/TestExtensions.kt b/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/TestExtensions.kt index eea7c3fd..c58687f0 100644 --- a/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/TestExtensions.kt +++ b/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/TestExtensions.kt @@ -2,14 +2,7 @@ package com.wealthfront.magellan.sample.migration -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.runBlocking -import org.mockito.Mockito.verify -import org.mockito.Mockito.`when` -import org.mockito.stubbing.LenientStubber -import org.mockito.stubbing.OngoingStubbing -import org.mockito.verification.VerificationMode - +/* fun LenientStubber.coWhen(block: suspend CoroutineScope.() -> T): OngoingStubbing = runBlocking { this@coWhen.`when`(block()) @@ -31,3 +24,4 @@ fun coVerify(mock: T, mode: VerificationMode, block: suspend CoroutineScope. block(verify(mock, mode)) } } +*/ \ No newline at end of file diff --git a/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/TestToolbarHelperModule.kt b/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/TestToolbarHelperModule.kt index ecdd8461..744ecd17 100644 --- a/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/TestToolbarHelperModule.kt +++ b/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/TestToolbarHelperModule.kt @@ -3,7 +3,7 @@ package com.wealthfront.magellan.sample.migration import com.wealthfront.magellan.sample.migration.toolbar.ToolbarHelper import dagger.Module import dagger.Provides -import org.mockito.Mockito.mock +import io.mockk.mockk import javax.inject.Singleton @Module @@ -12,6 +12,6 @@ object TestToolbarHelperModule { @Provides @Singleton fun provideToolbarHelper(): ToolbarHelper { - return mock(ToolbarHelper::class.java) + return mockk(relaxed = true) } } diff --git a/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/tide/DogDetailsScreenTest.kt b/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/tide/DogDetailsScreenTest.kt index e45afde6..efe089d3 100644 --- a/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/tide/DogDetailsScreenTest.kt +++ b/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/tide/DogDetailsScreenTest.kt @@ -10,16 +10,12 @@ import com.wealthfront.magellan.lifecycle.transitionToState import com.wealthfront.magellan.sample.migration.AppComponentContainer import com.wealthfront.magellan.sample.migration.TestAppComponent import com.wealthfront.magellan.sample.migration.api.DogImageResponse -import com.wealthfront.magellan.sample.migration.coWhen +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.mockk import org.junit.Before -import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith -import org.mockito.Mock -import org.mockito.Mockito.verify -import org.mockito.junit.MockitoJUnit -import org.mockito.junit.MockitoRule -import org.mockito.quality.Strictness import org.robolectric.Robolectric.buildActivity import org.robolectric.RobolectricTestRunner import org.robolectric.Shadows.shadowOf @@ -33,10 +29,7 @@ class DogDetailsScreenTest { status = "success" ) - @Mock lateinit var dogDetailsView: DogDetailsView - - @Rule @JvmField - val mockitoRule: MockitoRule = MockitoJUnit.rule().strictness(Strictness.WARN) + private val dogDetailsView = mockk(relaxed = true) @Before fun setup() { @@ -54,13 +47,13 @@ class DogDetailsScreenTest { } } - coWhen { component.api.getRandomImageForBreed("robotic") }.thenReturn(breedData) + coEvery { component.api.getRandomImageForBreed("robotic") } returns breedData } @Test fun fetchesDogBreedOnShow() { screen.transitionToState(LifecycleState.Shown(activity)) shadowOf(getMainLooper()).idle() - verify(dogDetailsView).setDogPic("image-url") + coVerify { dogDetailsView.setDogPic("image-url") } } } diff --git a/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/tide/DogDetailsViewTest.kt b/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/tide/DogDetailsViewTest.kt index f76f86c2..3dd5958f 100644 --- a/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/tide/DogDetailsViewTest.kt +++ b/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/tide/DogDetailsViewTest.kt @@ -6,32 +6,24 @@ import android.os.Looper.getMainLooper import androidx.test.core.app.ApplicationProvider import com.bumptech.glide.RequestBuilder import com.bumptech.glide.RequestManager +import io.mockk.every +import io.mockk.mockk +import io.mockk.verify import org.junit.Before -import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith -import org.mockito.ArgumentMatchers.anyString -import org.mockito.Mock -import org.mockito.Mockito.verify -import org.mockito.Mockito.`when` -import org.mockito.junit.MockitoJUnit -import org.mockito.junit.MockitoRule -import org.mockito.quality.Strictness import org.robolectric.RobolectricTestRunner import org.robolectric.Shadows.shadowOf @RunWith(RobolectricTestRunner::class) class DogDetailsViewTest { - @Mock lateinit var glideRequest: RequestManager - @Mock lateinit var drawableRequest: RequestBuilder + private val glideRequest = mockk(relaxed = true) + private val drawableRequest = mockk>(relaxed = true) private lateinit var view: DogDetailsView private lateinit var context: Context - @Rule @JvmField - val mockitoRule: MockitoRule = MockitoJUnit.rule().strictness(Strictness.WARN) - @Before fun setup() { context = ApplicationProvider.getApplicationContext() @@ -39,13 +31,13 @@ class DogDetailsViewTest { glideBuilder = glideRequest } - `when`(glideRequest.load(anyString())).thenReturn(drawableRequest) + every { glideRequest.load(ofType(String::class)) } returns drawableRequest } @Test fun fetchesDogPicOnShow() { view.setDogPic("https://dailybeagle.com/latest-picture") shadowOf(getMainLooper()).idle() - verify(drawableRequest).into(view.viewBinding.dogImage) + verify { drawableRequest.into(view.viewBinding.dogImage) } } } diff --git a/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/tide/DogListStepTest.kt b/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/tide/DogListStepTest.kt index 36c31edc..ed89a95e 100644 --- a/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/tide/DogListStepTest.kt +++ b/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/tide/DogListStepTest.kt @@ -9,7 +9,7 @@ import com.wealthfront.magellan.lifecycle.setContentScreen import com.wealthfront.magellan.sample.migration.AppComponentContainer import com.wealthfront.magellan.sample.migration.TestAppComponent import com.wealthfront.magellan.sample.migration.api.DogBreedsResponse -import com.wealthfront.magellan.sample.migration.coWhen +import io.mockk.coEvery import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -33,8 +33,8 @@ class DogListStepTest { val component = ((context as AppComponentContainer).injector() as TestAppComponent) component.inject(this) dogListStep = dogListStepFactory.create { chosenBreed = it } - coWhen { component.api.getAllBreeds() } - .thenReturn(DogBreedsResponse(message = mapOf("akita" to emptyList()), status = "success")) + coEvery { component.api.getAllBreeds() } returns + DogBreedsResponse(message = mapOf("akita" to emptyList()), status = "success") } @Test From 9001148b8cd737339d8cce8f380973bf5acf2a01 Mon Sep 17 00:00:00 2001 From: cmathew Date: Fri, 27 Oct 2023 11:30:11 -0700 Subject: [PATCH 2/2] remove unused file --- .../sample/migration/TestExtensions.kt | 27 ------------------- .../migration/tide/DogDetailsScreenTest.kt | 1 + 2 files changed, 1 insertion(+), 27 deletions(-) delete mode 100644 magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/TestExtensions.kt diff --git a/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/TestExtensions.kt b/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/TestExtensions.kt deleted file mode 100644 index c58687f0..00000000 --- a/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/TestExtensions.kt +++ /dev/null @@ -1,27 +0,0 @@ -@file:Suppress("UNCHECKED_CAST") - -package com.wealthfront.magellan.sample.migration - -/* -fun LenientStubber.coWhen(block: suspend CoroutineScope.() -> T): OngoingStubbing = - runBlocking { - this@coWhen.`when`(block()) - } - -fun coWhen(block: suspend CoroutineScope.() -> T): OngoingStubbing = - runBlocking { - `when`(block()) - } - -fun coVerify(mock: T, block: suspend CoroutineScope.(T) -> Unit) { - runBlocking { - block(verify(mock)) - } -} - -fun coVerify(mock: T, mode: VerificationMode, block: suspend CoroutineScope.(T) -> Unit) { - runBlocking { - block(verify(mock, mode)) - } -} -*/ \ No newline at end of file diff --git a/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/tide/DogDetailsScreenTest.kt b/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/tide/DogDetailsScreenTest.kt index efe089d3..a1b8e1d1 100644 --- a/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/tide/DogDetailsScreenTest.kt +++ b/magellan-sample-migration/src/test/java/com/wealthfront/magellan/sample/migration/tide/DogDetailsScreenTest.kt @@ -22,6 +22,7 @@ import org.robolectric.Shadows.shadowOf @RunWith(RobolectricTestRunner::class) class DogDetailsScreenTest { + private lateinit var screen: DogDetailsScreen private val activity = buildActivity(ComponentActivity::class.java).get() private val breedData = DogImageResponse(