Skip to content

Commit 605fa9e

Browse files
added unit test
1 parent a79df36 commit 605fa9e

5 files changed

Lines changed: 114 additions & 0 deletions

File tree

HiltAndroid/app/build.gradle

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,17 @@ android {
3636
buildFeatures {
3737
viewBinding true
3838
}
39+
40+
hilt {
41+
enableTransformForLocalTests = true
42+
}
43+
44+
testOptions {
45+
unitTests {
46+
includeAndroidResources = true
47+
}
48+
}
49+
3950
namespace 'com.velmurugan.hiltandroid'
4051
}
4152

@@ -46,7 +57,9 @@ dependencies {
4657
implementation 'androidx.appcompat:appcompat:1.6.1'
4758
implementation 'com.google.android.material:material:1.8.0'
4859
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
60+
implementation 'androidx.test:core-ktx:1.4.0'
4961
testImplementation 'junit:junit:4.13.2'
62+
testImplementation 'junit:junit:4.12'
5063
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
5164
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
5265

@@ -72,5 +85,15 @@ dependencies {
7285
implementation "androidx.navigation:navigation-fragment-ktx:2.5.3"
7386
implementation "androidx.navigation:navigation-ui-ktx:2.5.3"
7487

88+
// Unit Testing
89+
// For Robolectric tests.
90+
testImplementation 'com.google.dagger:hilt-android-testing:2.44'
91+
// ...with Kotlin.
92+
kaptTest 'com.google.dagger:hilt-android-compiler:2.44'
93+
// ...with Java.
94+
testAnnotationProcessor 'com.google.dagger:hilt-android-compiler:2.44'
95+
testImplementation "org.robolectric:robolectric:4.9"
7596

97+
testImplementation 'androidx.test:runner:1.5.2'
98+
testImplementation 'androidx.test.espresso:espresso-core:3.5.1'
7699
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
3+
4+
<application>
5+
<activity android:name=".HiltTestActivity"
6+
android:exported="true">
7+
</activity>
8+
</application>
9+
10+
</manifest>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.velmurugan.hiltandroid
2+
3+
import androidx.appcompat.app.AppCompatActivity
4+
import dagger.hilt.android.AndroidEntryPoint
5+
6+
@AndroidEntryPoint
7+
class HiltTestActivity : AppCompatActivity() {
8+
9+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.velmurugan.hiltandroid
2+
3+
import android.content.ComponentName
4+
import android.content.Intent
5+
import android.os.Bundle
6+
import androidx.fragment.app.Fragment
7+
import androidx.fragment.app.FragmentFactory
8+
import androidx.test.core.app.ActivityScenario
9+
import androidx.test.core.app.ApplicationProvider
10+
11+
inline fun <reified T : Fragment> launchFragmentInHiltContainer(
12+
fragmentArgs: Bundle? = null,
13+
themeResId: Int = R.style.Theme_HiltAndroid,
14+
fragmentFactory: FragmentFactory? = null,
15+
crossinline action: T.() -> Unit = {}
16+
) {
17+
val mainActivityIntent = Intent.makeMainActivity(
18+
ComponentName(
19+
ApplicationProvider.getApplicationContext(),
20+
HiltTestActivity::class.java
21+
)
22+
)
23+
ActivityScenario.launch<HiltTestActivity>(mainActivityIntent).onActivity { activity ->
24+
fragmentFactory?.let {
25+
activity.supportFragmentManager.fragmentFactory = it
26+
}
27+
val fragment = activity.supportFragmentManager.fragmentFactory.instantiate(
28+
checkNotNull(T::class.java.classLoader),
29+
T::class.java.name
30+
)
31+
fragment.arguments = fragmentArgs
32+
activity.supportFragmentManager.beginTransaction()
33+
.add(android.R.id.content, fragment, "")
34+
.commitNow()
35+
(fragment as T).action()
36+
}
37+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.velmurugan.hiltandroid.ui
2+
3+
import androidx.test.espresso.Espresso
4+
import androidx.test.espresso.assertion.ViewAssertions
5+
import androidx.test.espresso.matcher.ViewMatchers
6+
import com.velmurugan.hiltandroid.launchFragmentInHiltContainer
7+
import dagger.hilt.android.testing.HiltAndroidRule
8+
import dagger.hilt.android.testing.HiltAndroidTest
9+
import dagger.hilt.android.testing.HiltTestApplication
10+
import kotlinx.coroutines.runBlocking
11+
import org.junit.Rule
12+
import org.junit.Test
13+
import org.junit.runner.RunWith
14+
import org.robolectric.Robolectric
15+
import org.robolectric.RobolectricTestRunner
16+
import org.robolectric.annotation.Config
17+
18+
@HiltAndroidTest
19+
@RunWith(RobolectricTestRunner::class)
20+
@Config(application = HiltTestApplication::class)
21+
class HomeFragmentTest {
22+
23+
@get:Rule
24+
val hiltAndroidRule = HiltAndroidRule(this)
25+
26+
@Test
27+
fun homeTest() {
28+
runBlocking {
29+
launchFragmentInHiltContainer<HomeFragment> {
30+
Espresso.onView(ViewMatchers.withText("Coco")).check(ViewAssertions.matches(ViewMatchers.isDisplayed()))
31+
}
32+
}
33+
}
34+
35+
}

0 commit comments

Comments
 (0)