diff --git a/.idea/navEditor.xml b/.idea/navEditor.xml
new file mode 100644
index 0000000..ecf2827
--- /dev/null
+++ b/.idea/navEditor.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 4ad5f87..25a838a 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -6,6 +6,11 @@ apply plugin: 'androidx.navigation.safeargs'
apply plugin: 'kotlin-kapt'
android {
+ useLibrary 'android.test.runner'
+
+ useLibrary 'android.test.base'
+ useLibrary 'android.test.mock'
+
compileSdkVersion versions.compileSdkVersion
dataBinding {
enabled = true
@@ -45,6 +50,34 @@ dependencies {
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:' + versions.coroutines
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:' + versions.coroutinesTest
+
+ // Dependencies for local unit tests
+
+ testImplementation 'androidx.test:core-ktx:' + versions.androidxCore
+ testImplementation 'org.robolectric:robolectric:' + versions.roboelectric
+ testImplementation 'androidx.test.ext:junit-ktx:' + versions. androidXTestExtKotlinRunner
+
+
+ // AndroidX Test - Instrumented testing
+ androidTestImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:' + versions.coroutinesTest
+ androidTestImplementation 'androidx.test.ext:junit:' + versions. androidXTestExtKotlinRunner
+ androidTestImplementation 'androidx.test.espresso:espresso-core:' + versions.espressoCore
+ androidTestImplementation 'androidx.test.espresso:espresso-contrib:' + versions.espressoCore
+
+ androidTestImplementation 'junit:junit:' + versions.junit
+ androidTestImplementation 'org.mockito:mockito-core:' + versions.mockito
+ androidTestImplementation 'com.linkedin.dexmaker:dexmaker-mockito:' + versions.dexMaker
+
+
+ // Dependencies for Android instrumented unit tests
+ // androidTestImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:' + versions.coroutines
+
+ // Testing code should not be included in the main code.
+ // Once https://issuetracker.google.com/128612536 is fixed this can be fixed.
+
+ implementation ("androidx.fragment:fragment-testing:1.1.0-beta01", {exclude group: 'androidx.test', module: 'core'} )
+ implementation 'androidx.test:core:' + versions.androidxCore
+
androidTestImplementation 'androidx.test:runner:' + versions.testRunner
androidTestImplementation 'androidx.test.espresso:espresso-core:' + versions.espressoCore
androidTestImplementation 'androidx.arch.core:core-testing:' + versions.coreTestingVersion
@@ -69,7 +102,7 @@ dependencies {
// Android X
- implementation 'androidx.core:core-ktx:' + versions.androidxCore
+ implementation 'androidx.core:core-ktx:' + versions.androidXCore
implementation 'androidx.recyclerview:recyclerview:' + versions.androidxRecyclerView
implementation 'androidx.browser:browser:' + versions.androidxBrowser
diff --git a/app/src/androidTest/java/com/cottacush/android/androidbaseprojectkt/sample/catlist/BreedListFragmentTest.kt b/app/src/androidTest/java/com/cottacush/android/androidbaseprojectkt/sample/catlist/BreedListFragmentTest.kt
new file mode 100644
index 0000000..a5a5724
--- /dev/null
+++ b/app/src/androidTest/java/com/cottacush/android/androidbaseprojectkt/sample/catlist/BreedListFragmentTest.kt
@@ -0,0 +1,80 @@
+package com.cottacush.android.androidbaseprojectkt.sample.catlist
+
+import android.os.Bundle
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.fragment.app.testing.launchFragmentInContainer
+import androidx.navigation.NavController
+import androidx.navigation.Navigation
+import androidx.recyclerview.widget.RecyclerView
+import androidx.room.Room
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.espresso.Espresso.onView
+import androidx.test.espresso.action.ViewActions.click
+import androidx.test.espresso.contrib.RecyclerViewActions
+import androidx.test.espresso.matcher.ViewMatchers.*
+import androidx.test.filters.MediumTest
+import com.cottacush.android.androidbaseprojectkt.R
+import com.cottacush.android.androidbaseprojectkt.sample.breeddetails.BreedDetailsFragment
+import com.cottacush.android.androidbaseprojectkt.sample.models.BreedDatabase
+import com.cottacush.android.androidbaseprojectkt.sample.models.DatabaseBreedModel
+import com.cottacush.android.androidbaseprojectkt.sample.models.asDomainModel
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.runBlockingTest
+import org.junit.After
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.InjectMocks
+import org.mockito.Mockito.mock
+import org.mockito.Mockito.verify
+
+
+@MediumTest
+@ExperimentalCoroutinesApi
+@RunWith(AndroidJUnit4::class)
+class BreedListFragmentTest {
+
+ private val database = Room
+ .inMemoryDatabaseBuilder(
+ ApplicationProvider.getApplicationContext(),
+ BreedDatabase::class.java
+ ).build()
+ private val dataBaseBreed = mock(DatabaseBreedModel::class.java)
+ private val list = listOf(dataBaseBreed)
+ private val model = list.asDomainModel()[0]
+
+ @Test
+ fun clickBreed_navigateToDetailFragment() {
+ runBlockingTest {
+ database.breedDao.insertAllBreed(dataBaseBreed)
+ }
+ val navController = mock(NavController::class.java)
+
+ val scenerio = launchFragmentInContainer(Bundle(), R.style.AppTheme)
+
+ scenerio.onFragment {
+ Navigation.setViewNavController(it.view!!, navController)
+ }
+ onView(withId(R.id.breedsRecyclerView))
+ .perform(
+ RecyclerViewActions.actionOnItem(
+ hasDescendant(
+ withText(model.description)
+ ), click()
+ )
+ )
+
+ verify(navController).navigate(
+ BreedListFragmentDirections.actionCatsListFragmentToBreedDetailsFragment(
+ model
+ )
+ )
+ }
+
+ @After
+ fun tearDown() {
+ database?.run {
+ clearAllTables()
+ close()
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 91410d5..53e1249 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -6,6 +6,7 @@
+
\ No newline at end of file
diff --git a/dependencies.gradle b/dependencies.gradle
index dd9b61e..b46f87e 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -9,10 +9,15 @@ ext.versions = [
//tests
junit : '4.12',
testRunner : '1.2.0',
- espressoCore : '3.2.0',
+ espressoCore : '3.2.0-beta01',
coreTestingVersion : '2.0.0',
- coroutinesCore : '1.2.1',
+ coroutinesCore : '1.3.2',
coroutinesTest : '1.3.2',
+ dexMaker : '2.12.1',
+ fragment : '1.1.0-alpha07',
+ androidxCore : '1.2.0',
+ roboelectric : '4.3.1',
+ androidXTestExtKotlinRunner :'1.1.1',
//mockito
mockitoVersion : "2.25.0",
@@ -24,11 +29,11 @@ ext.versions = [
spotlessPlugin : '3.23.1',
// Kotlin
- kotlin : '1.3.40',
+ kotlin : '1.3.50',
coroutines : '1.2.1',
// AndroidX
- androidxCore : '1.0.1',
+ androidXCore : '1.0.1',
androidxRecyclerView: '1.0.0',
androidxMaterial : '1.0.0',
androidxBrowser : '1.0.0',
diff --git a/gradle.properties b/gradle.properties
index 23339e0..780a4a2 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -19,3 +19,5 @@ android.useAndroidX=true
android.enableJetifier=true
# Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official
+
+kapt.incremental.apt=true