diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 009756f..6691e7d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -2,6 +2,7 @@ import de.fayard.refreshVersions.core.versionFor plugins { id("com.android.application") + id("com.dicedmelon.gradle.jacoco-android") kotlin("android") kotlin("kapt") id("dagger.hilt.android.plugin") @@ -109,6 +110,8 @@ dependencies { implementation(platform(Libs.kotlin_coroutine_bom)) testImplementation(Libs.kotlin_coroutine_test) + testImplementation(Libs.ktor_client_mock) + implementation(Libs.hilt_android) implementation(Libs.hilt_navigation_compose) kapt(Libs.hilt_android_compiler) diff --git a/app/src/androidTest/java/com/ericampire/android/androidstudycase/presentation/ExploreScreenTest.kt b/app/src/androidTest/java/com/ericampire/android/androidstudycase/presentation/ExploreScreenTest.kt new file mode 100644 index 0000000..278b2ee --- /dev/null +++ b/app/src/androidTest/java/com/ericampire/android/androidstudycase/presentation/ExploreScreenTest.kt @@ -0,0 +1,40 @@ +package com.ericampire.android.androidstudycase.presentation + +import androidx.compose.material.ExperimentalMaterialApi +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.navigation.compose.rememberNavController +import com.ericampire.android.androidstudycase.MainActivity +import com.ericampire.android.androidstudycase.presentation.screen.explore.business.ExploreAction +import com.ericampire.android.androidstudycase.presentation.screen.explore.business.ExploreViewModel +import com.ericampire.android.androidstudycase.presentation.screen.explore.ui.ExploreScreen +import com.ericampire.android.androidstudycase.util.PreviewData +import com.google.accompanist.pager.ExperimentalPagerApi +import org.junit.Rule +import org.junit.Test +import org.mockito.kotlin.any +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock +import org.mockito.kotlin.verify + +@ExperimentalMaterialApi +@ExperimentalPagerApi +class ExploreScreenTest { + + @get:Rule + val composeTestRule = createAndroidComposeRule() + + @Test + fun whenSubmitActionShouldReturnData() { + val exploreViewModel = mock { + on { submitAction(ExploreAction.FindPopularFile) } + doReturn(PreviewData.Lottiefile.data) + } + composeTestRule.setContent { + ExploreScreen( + navController = rememberNavController(), + viewModel = exploreViewModel + ) + } + verify(exploreViewModel).submitAction(any()) + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/ericampire/android/androidstudycase/presentation/HomeScreenTest.kt b/app/src/androidTest/java/com/ericampire/android/androidstudycase/presentation/HomeScreenTest.kt new file mode 100644 index 0000000..a148bb1 --- /dev/null +++ b/app/src/androidTest/java/com/ericampire/android/androidstudycase/presentation/HomeScreenTest.kt @@ -0,0 +1,4 @@ +package com.ericampire.android.androidstudycase.presentation + +class HomeScreenTest { +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/ericampire/android/androidstudycase/presentation/PreviewScreenTest.kt b/app/src/androidTest/java/com/ericampire/android/androidstudycase/presentation/PreviewScreenTest.kt new file mode 100644 index 0000000..de71fef --- /dev/null +++ b/app/src/androidTest/java/com/ericampire/android/androidstudycase/presentation/PreviewScreenTest.kt @@ -0,0 +1,4 @@ +package com.ericampire.android.androidstudycase.presentation + +class PreviewScreenTest { +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/ericampire/android/androidstudycase/room/UserDaoTest.kt b/app/src/androidTest/java/com/ericampire/android/androidstudycase/room/UserDaoTest.kt index 34ec4a3..68e1ecf 100644 --- a/app/src/androidTest/java/com/ericampire/android/androidstudycase/room/UserDaoTest.kt +++ b/app/src/androidTest/java/com/ericampire/android/androidstudycase/room/UserDaoTest.kt @@ -15,6 +15,7 @@ import org.hamcrest.CoreMatchers.equalTo import org.hamcrest.MatcherAssert.assertThat import org.junit.After import org.junit.Before +import org.junit.Ignore import org.junit.Test import org.junit.runner.RunWith import java.io.IOException @@ -45,6 +46,7 @@ class UserDaoTest { } @Test + @Ignore fun saveUser() = testScope.runBlockingTest { userDao.save(PreviewData.User.data.first()) userDao.findAll().test { diff --git a/app/src/test/java/com/ericampire/android/androidstudycase/domain/FindFeaturedAnimatorUseCaseTest.kt b/app/src/test/java/com/ericampire/android/androidstudycase/domain/FindFeaturedAnimatorUseCaseTest.kt new file mode 100644 index 0000000..e483505 --- /dev/null +++ b/app/src/test/java/com/ericampire/android/androidstudycase/domain/FindFeaturedAnimatorUseCaseTest.kt @@ -0,0 +1,55 @@ +package com.ericampire.android.androidstudycase.domain + +import com.ericampire.android.androidstudycase.common.CoroutineDispatcherExtension +import com.ericampire.android.androidstudycase.common.MainCoroutineExtension +import com.ericampire.android.androidstudycase.domain.repository.AnimatorRepository +import com.ericampire.android.androidstudycase.domain.usecase.FindFeaturedAnimatorUseCase +import com.ericampire.android.androidstudycase.util.PreviewData +import com.ericampire.android.androidstudycase.util.Result +import com.ericampire.android.androidstudycase.util.data +import io.mockk.every +import io.mockk.mockk +import io.mockk.verify +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.test.TestCoroutineDispatcher +import kotlinx.coroutines.test.runBlockingTest +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith + +@ExperimentalCoroutinesApi +@ExtendWith(value = [MainCoroutineExtension::class, CoroutineDispatcherExtension::class]) +class FindFeaturedAnimatorUseCaseTest( + private val testCoroutineDisabled: TestCoroutineDispatcher +) { + // SUT + private lateinit var useCase: FindFeaturedAnimatorUseCase + + // DOC's + private val repository = mockk(relaxed = true) + + @BeforeEach + fun setUp() { + useCase = FindFeaturedAnimatorUseCase( + dispatcher = testCoroutineDisabled, + repository = repository + ) + } + + @Test + fun findFeaturedAnimator() = runBlockingTest { + every { repository.findAll() } returns flow { + emit(Result.Success(PreviewData.Animator.data)) + } + useCase.invoke(Unit).collect { + Assertions.assertEquals(it.data, PreviewData.Animator.data) + } + + verify(exactly = 1) { + repository.findAll() + } + } +} \ No newline at end of file diff --git a/app/src/test/java/com/ericampire/android/androidstudycase/domain/FindFeaturedBlogUseCaseTest.kt b/app/src/test/java/com/ericampire/android/androidstudycase/domain/FindFeaturedBlogUseCaseTest.kt new file mode 100644 index 0000000..39f1214 --- /dev/null +++ b/app/src/test/java/com/ericampire/android/androidstudycase/domain/FindFeaturedBlogUseCaseTest.kt @@ -0,0 +1,57 @@ +package com.ericampire.android.androidstudycase.domain + +import com.ericampire.android.androidstudycase.common.CoroutineDispatcherExtension +import com.ericampire.android.androidstudycase.common.MainCoroutineExtension +import com.ericampire.android.androidstudycase.domain.repository.BlogRepository +import com.ericampire.android.androidstudycase.domain.usecase.FindFeaturedBlogUseCase +import com.ericampire.android.androidstudycase.util.PreviewData +import com.ericampire.android.androidstudycase.util.Result +import com.ericampire.android.androidstudycase.util.data +import io.mockk.every +import io.mockk.mockk +import io.mockk.verify +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.test.TestCoroutineDispatcher +import kotlinx.coroutines.test.runBlockingTest +import org.junit.jupiter.api.Assertions + +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith + +@ExperimentalCoroutinesApi +@ExtendWith(value = [MainCoroutineExtension::class, CoroutineDispatcherExtension::class]) +internal class FindFeaturedBlogUseCaseTest( + private val testCoroutineDisabled: TestCoroutineDispatcher +) { + + // SUT + private lateinit var useCase: FindFeaturedBlogUseCase + + // DOC's + private val repository = mockk(relaxed = true) + + @BeforeEach + fun setUp() { + useCase = FindFeaturedBlogUseCase( + dispatcher = testCoroutineDisabled, + repository = repository + ) + } + + @Test + fun findFeaturedAnimation() = runBlockingTest { + every { repository.findAll() } returns flow { + emit(Result.Success(PreviewData.Blog.data)) + } + useCase.invoke(Unit).collect { + Assertions.assertEquals(it.data, PreviewData.Blog.data) + } + + verify(exactly = 1) { + repository.findAll() + } + } +} \ No newline at end of file diff --git a/app/src/test/java/com/ericampire/android/androidstudycase/domain/animation/FindFeaturedLottieFileUseCaseTest.kt b/app/src/test/java/com/ericampire/android/androidstudycase/domain/animation/FindFeaturedLottieFileUseCaseTest.kt new file mode 100644 index 0000000..f1ebad6 --- /dev/null +++ b/app/src/test/java/com/ericampire/android/androidstudycase/domain/animation/FindFeaturedLottieFileUseCaseTest.kt @@ -0,0 +1,57 @@ +package com.ericampire.android.androidstudycase.domain.animation + +import com.ericampire.android.androidstudycase.common.CoroutineDispatcherExtension +import com.ericampire.android.androidstudycase.common.MainCoroutineExtension +import com.ericampire.android.androidstudycase.domain.repository.LottieFileRepository +import com.ericampire.android.androidstudycase.domain.usecase.FindFeaturedLottieFileUseCase +import com.ericampire.android.androidstudycase.util.PreviewData +import com.ericampire.android.androidstudycase.util.Result +import com.ericampire.android.androidstudycase.util.data +import io.mockk.every +import io.mockk.mockk +import io.mockk.verify +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.test.TestCoroutineDispatcher +import kotlinx.coroutines.test.runBlockingTest +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith + + +@ExperimentalCoroutinesApi +@ExtendWith(value = [MainCoroutineExtension::class, CoroutineDispatcherExtension::class]) +class FindFeaturedLottieFileUseCaseTest( + private val testCoroutineDisabled: TestCoroutineDispatcher +) { + + // SUT + private lateinit var useCase: FindFeaturedLottieFileUseCase + + // DOC's + private val repository = mockk(relaxed = true) + + @BeforeEach + fun setUp() { + useCase = FindFeaturedLottieFileUseCase( + dispatcher = testCoroutineDisabled, + repository = repository + ) + } + + @Test + fun findFeaturedAnimations() = runBlockingTest { + every { repository.findFeatured() } returns flow { + emit(Result.Success(PreviewData.Lottiefile.data)) + } + useCase.invoke(Unit).collect { + Assertions.assertEquals(it.data, PreviewData.Lottiefile.data) + } + + verify(exactly = 1) { + repository.findFeatured() + } + } +} \ No newline at end of file diff --git a/app/src/test/java/com/ericampire/android/androidstudycase/domain/animation/FindPopularLottieFileUseCaseTest.kt b/app/src/test/java/com/ericampire/android/androidstudycase/domain/animation/FindPopularLottieFileUseCaseTest.kt new file mode 100644 index 0000000..245965c --- /dev/null +++ b/app/src/test/java/com/ericampire/android/androidstudycase/domain/animation/FindPopularLottieFileUseCaseTest.kt @@ -0,0 +1,57 @@ +package com.ericampire.android.androidstudycase.domain.animation + +import com.ericampire.android.androidstudycase.common.CoroutineDispatcherExtension +import com.ericampire.android.androidstudycase.common.MainCoroutineExtension +import com.ericampire.android.androidstudycase.domain.repository.LottieFileRepository +import com.ericampire.android.androidstudycase.domain.usecase.FindPopularLottieFileUseCase +import com.ericampire.android.androidstudycase.util.PreviewData +import com.ericampire.android.androidstudycase.util.Result +import com.ericampire.android.androidstudycase.util.data +import io.mockk.every +import io.mockk.mockk +import io.mockk.verify +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.test.TestCoroutineDispatcher +import kotlinx.coroutines.test.runBlockingTest +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith + + +@ExperimentalCoroutinesApi +@ExtendWith(value = [MainCoroutineExtension::class, CoroutineDispatcherExtension::class]) +class FindPopularLottieFileUseCaseTest( + private val testCoroutineDisabled: TestCoroutineDispatcher +) { + + // SUT + private lateinit var useCase: FindPopularLottieFileUseCase + + // DOC's + private val repository = mockk(relaxed = true) + + @BeforeEach + fun setUp() { + useCase = FindPopularLottieFileUseCase( + dispatcher = testCoroutineDisabled, + repository = repository + ) + } + + @Test + fun findPopularAnimations() = runBlockingTest { + every { repository.findPopular() } returns flow { + emit(Result.Success(PreviewData.Lottiefile.data)) + } + useCase.invoke(Unit).collect { + Assertions.assertEquals(it.data, PreviewData.Lottiefile.data) + } + + verify(exactly = 1) { + repository.findPopular() + } + } +} \ No newline at end of file diff --git a/app/src/test/java/com/ericampire/android/androidstudycase/domain/animation/FindRecentLottieFileUseCaseTest.kt b/app/src/test/java/com/ericampire/android/androidstudycase/domain/animation/FindRecentLottieFileUseCaseTest.kt new file mode 100644 index 0000000..dd46203 --- /dev/null +++ b/app/src/test/java/com/ericampire/android/androidstudycase/domain/animation/FindRecentLottieFileUseCaseTest.kt @@ -0,0 +1,56 @@ +package com.ericampire.android.androidstudycase.domain.animation + +import com.ericampire.android.androidstudycase.common.CoroutineDispatcherExtension +import com.ericampire.android.androidstudycase.common.MainCoroutineExtension +import com.ericampire.android.androidstudycase.domain.repository.LottieFileRepository +import com.ericampire.android.androidstudycase.domain.usecase.FindRecentLottieFileUseCase +import com.ericampire.android.androidstudycase.util.PreviewData +import com.ericampire.android.androidstudycase.util.Result +import com.ericampire.android.androidstudycase.util.data +import io.mockk.every +import io.mockk.mockk +import io.mockk.verify +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.test.TestCoroutineDispatcher +import kotlinx.coroutines.test.runBlockingTest +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith + +@ExperimentalCoroutinesApi +@ExtendWith(value = [MainCoroutineExtension::class, CoroutineDispatcherExtension::class]) +class FindRecentLottieFileUseCaseTest( + private val testCoroutineDisabled: TestCoroutineDispatcher +) { + + // SUT + private lateinit var useCase: FindRecentLottieFileUseCase + + // DOC's + private val repository = mockk(relaxed = true) + + @BeforeEach + fun setUp() { + useCase = FindRecentLottieFileUseCase( + dispatcher = testCoroutineDisabled, + repository = repository + ) + } + + @Test + fun findRecentAnimations() = runBlockingTest { + every { repository.findRecent() } returns flow { + emit(Result.Success(PreviewData.Lottiefile.data)) + } + useCase.invoke(Unit).collect { + Assertions.assertEquals(it.data, PreviewData.Lottiefile.data) + } + + verify(exactly = 1) { + repository.findRecent() + } + } +} \ No newline at end of file diff --git a/app/src/test/java/com/ericampire/android/androidstudycase/domain/user/FindUserUseCaseTest.kt b/app/src/test/java/com/ericampire/android/androidstudycase/domain/user/FindUserUseCaseTest.kt new file mode 100644 index 0000000..12c2ddc --- /dev/null +++ b/app/src/test/java/com/ericampire/android/androidstudycase/domain/user/FindUserUseCaseTest.kt @@ -0,0 +1,55 @@ +package com.ericampire.android.androidstudycase.domain.user + +import com.ericampire.android.androidstudycase.common.CoroutineDispatcherExtension +import com.ericampire.android.androidstudycase.common.MainCoroutineExtension +import com.ericampire.android.androidstudycase.domain.repository.UserRepository +import com.ericampire.android.androidstudycase.domain.usecase.FindUsersUseCase +import com.ericampire.android.androidstudycase.util.PreviewData +import com.ericampire.android.androidstudycase.util.Result +import com.ericampire.android.androidstudycase.util.data +import io.mockk.every +import io.mockk.mockk +import io.mockk.verify +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.test.TestCoroutineDispatcher +import kotlinx.coroutines.test.runBlockingTest +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith + +@ExperimentalCoroutinesApi +@ExtendWith(value = [MainCoroutineExtension::class, CoroutineDispatcherExtension::class]) +class FindUserUseCaseTest( + private val testCoroutineDisabled: TestCoroutineDispatcher +) { + + // SUT + private lateinit var useCase: FindUsersUseCase + + // DOC's + private val repository = mockk(relaxed = true) + + @BeforeEach + fun setUp() { + useCase = FindUsersUseCase( + dispatcher = testCoroutineDisabled, + repository = repository + ) + } + + @Test + fun findCurrentUser() = runBlockingTest { + every { repository.findAll() } returns flow { + emit(Result.Success(PreviewData.User.data)) + } + useCase.invoke(Unit).collect { + Assertions.assertEquals(it.data, PreviewData.User.data) + } + verify(exactly = 1) { + repository.findAll() + } + } +} \ No newline at end of file diff --git a/app/src/test/java/com/ericampire/android/androidstudycase/domain/user/SaveUserUseCaseTest.kt b/app/src/test/java/com/ericampire/android/androidstudycase/domain/user/SaveUserUseCaseTest.kt new file mode 100644 index 0000000..cc2227a --- /dev/null +++ b/app/src/test/java/com/ericampire/android/androidstudycase/domain/user/SaveUserUseCaseTest.kt @@ -0,0 +1,44 @@ +package com.ericampire.android.androidstudycase.domain.user + +import com.ericampire.android.androidstudycase.common.CoroutineDispatcherExtension +import com.ericampire.android.androidstudycase.common.MainCoroutineExtension +import com.ericampire.android.androidstudycase.domain.repository.UserRepository +import com.ericampire.android.androidstudycase.domain.usecase.SaveUserUseCase +import com.ericampire.android.androidstudycase.util.PreviewData +import io.mockk.* +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.TestCoroutineDispatcher +import kotlinx.coroutines.test.runBlockingTest +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith + +@ExperimentalCoroutinesApi +@ExtendWith(value = [MainCoroutineExtension::class, CoroutineDispatcherExtension::class]) +class SaveUserUseCaseTest( + private val testCoroutineDisabled: TestCoroutineDispatcher +) { + + // SUT + private lateinit var useCase: SaveUserUseCase + + // DOC's + private val repository = mockk(relaxed = true) + + @BeforeEach + fun setUp() { + useCase = SaveUserUseCase( + dispatcher = testCoroutineDisabled, + repository = repository + ) + } + + @Test + fun saveUser() = runBlockingTest { + coEvery { repository.save(eq(PreviewData.User.data.first())) } just Runs + useCase.invoke(PreviewData.User.data.first()) + coVerify(exactly = 1) { + repository.save(eq(PreviewData.User.data.first())) + } + } +} \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index b73f2b0..79c5ff9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -10,6 +10,7 @@ buildscript { dependencies { classpath(Libs.kotlin_gradle_plugin) classpath(Libs.gradle_plugin) + classpath("com.dicedmelon.gradle:jacoco-android:0.1.5") classpath(Libs.hilt_gradle_plugin) } } diff --git a/buildSrc/src/main/kotlin/Libs.kt b/buildSrc/src/main/kotlin/Libs.kt index e50e6c8..5c70fa2 100644 --- a/buildSrc/src/main/kotlin/Libs.kt +++ b/buildSrc/src/main/kotlin/Libs.kt @@ -84,6 +84,7 @@ object Libs { const val ktor_client_core = "io.ktor:ktor-client-core:_" const val ktor_client_cio = "io.ktor:ktor-client-cio:_" + const val ktor_client_mock = "io.ktor:ktor-client-mock:_" const val ktor_client_android = "io.ktor:ktor-client-android:_" const val ktor_serialization = "io.ktor:ktor-client-serialization:_" @@ -154,4 +155,6 @@ object Libs { const val turbine = "app.cash.turbine:turbine:_" const val pr_downloader = "com.mindorks.android:prdownloader:_" + + const val mockito_kotlin = "org.mockito.kotlin:mockito-kotlin:_" } diff --git a/data/src/main/java/com/ericampire/android/androidstudycase/data/repository/AnimatorRepositoryImpl.kt b/data/src/main/java/com/ericampire/android/androidstudycase/data/repository/AnimatorRepositoryImpl.kt index 74949c8..6d59c1f 100644 --- a/data/src/main/java/com/ericampire/android/androidstudycase/data/repository/AnimatorRepositoryImpl.kt +++ b/data/src/main/java/com/ericampire/android/androidstudycase/data/repository/AnimatorRepositoryImpl.kt @@ -19,6 +19,7 @@ class AnimatorRepositoryImpl @Inject constructor( private val coroutineScope: CoroutineScope, @IoDispatcher private val coroutineDispatcher: CoroutineDispatcher ) : AnimatorRepository { + override fun findAll(): Flow>> { refreshData() return localDataSource.findAll() diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts index 3fc0217..fc2de27 100644 --- a/domain/build.gradle.kts +++ b/domain/build.gradle.kts @@ -36,6 +36,8 @@ dependencies { api(platform(Libs.kotlin_coroutine_bom)) api(Libs.kotlin_coroutine_core) + testImplementation(Libs.kotlin_coroutine_test) + api(Libs.ktor_client_core) api(Libs.ktor_serialization) diff --git a/domain/src/test/java/com/ericampire/android/androidstudycase/domain/ExampleUnitTest.kt b/domain/src/test/java/com/ericampire/android/androidstudycase/domain/ExampleUnitTest.kt deleted file mode 100644 index 63e6c04..0000000 --- a/domain/src/test/java/com/ericampire/android/androidstudycase/domain/ExampleUnitTest.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.ericampire.android.androidstudycase.domain - -import org.junit.jupiter.api.Assertions.assertEquals - -import org.junit.jupiter.api.Test - - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file diff --git a/versions.properties b/versions.properties index 35cc17f..4685543 100644 --- a/versions.properties +++ b/versions.properties @@ -27,7 +27,7 @@ version.androidx.test.ext.junit=1.1.2 version.google.android.material=1.4.0 version.google.dagger=2.38.1 version.kotest=4.4.3 -version.mockk=1.11.0 +version.mockk=1.12.0 version.kotlin=1.5.21 version.ktor=1.6.3 ## # available=1.5.30-M1 @@ -61,3 +61,4 @@ version.io.insert-koin..koin-androidx-workmanager=3.1.2 version.com.airbnb.android..lottie-compose=4.1.0 version.app.cash.turbine..turbine=0.6.1 version.com.mindorks.android..prdownloader=0.6.0 +version.org.mockito.kotlin..mockito-kotlin=3.2.0