Testing Data Layer
This commit is contained in:
@@ -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)
|
||||
|
||||
+40
@@ -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<MainActivity>()
|
||||
|
||||
@Test
|
||||
fun whenSubmitActionShouldReturnData() {
|
||||
val exploreViewModel = mock<ExploreViewModel> {
|
||||
on { submitAction(ExploreAction.FindPopularFile) }
|
||||
doReturn(PreviewData.Lottiefile.data)
|
||||
}
|
||||
composeTestRule.setContent {
|
||||
ExploreScreen(
|
||||
navController = rememberNavController(),
|
||||
viewModel = exploreViewModel
|
||||
)
|
||||
}
|
||||
verify(exploreViewModel).submitAction(any())
|
||||
}
|
||||
}
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
package com.ericampire.android.androidstudycase.presentation
|
||||
|
||||
class HomeScreenTest {
|
||||
}
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
package com.ericampire.android.androidstudycase.presentation
|
||||
|
||||
class PreviewScreenTest {
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
+55
@@ -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<AnimatorRepository>(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()
|
||||
}
|
||||
}
|
||||
}
|
||||
+57
@@ -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<BlogRepository>(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()
|
||||
}
|
||||
}
|
||||
}
|
||||
+57
@@ -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<LottieFileRepository>(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()
|
||||
}
|
||||
}
|
||||
}
|
||||
+57
@@ -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<LottieFileRepository>(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()
|
||||
}
|
||||
}
|
||||
}
|
||||
+56
@@ -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<LottieFileRepository>(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()
|
||||
}
|
||||
}
|
||||
}
|
||||
+55
@@ -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<UserRepository>(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()
|
||||
}
|
||||
}
|
||||
}
|
||||
+44
@@ -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<UserRepository>(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()))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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:_"
|
||||
}
|
||||
|
||||
+1
@@ -19,6 +19,7 @@ class AnimatorRepositoryImpl @Inject constructor(
|
||||
private val coroutineScope: CoroutineScope,
|
||||
@IoDispatcher private val coroutineDispatcher: CoroutineDispatcher
|
||||
) : AnimatorRepository {
|
||||
|
||||
override fun findAll(): Flow<Result<List<Animator>>> {
|
||||
refreshData()
|
||||
return localDataSource.findAll()
|
||||
|
||||
@@ -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)
|
||||
|
||||
-18
@@ -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)
|
||||
}
|
||||
}
|
||||
+2
-1
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user