Так что вам, вероятно, следует предоставить AuthService
через модуль, один для обычного приложения и один для теста android, который предоставляет имитацию версии. Это означало бы удаление аннотаций Dagger из класса AuthService
. Я не использую Component.Factory
, но этого примера должно быть достаточно, чтобы вы могли использовать его в качестве руководства.
В папке androidTest
:
Создать тестовый модуль:
// normal app should include the module to supply this dependency
@Module object AndroidTestModule {
val mock : AuthService = Mockito.mock(AuthService::class.java)
@Provides
@Singleton
@JvmStatic
fun mockService() : AuthService = mock
}
Создать тестовый компонент:
@Component(modules = [AndroidTestModule::class])
@Singleton
interface AndroidTestComponent : AndroidInjector<AndroidTestApp> {
@Component.Builder interface Builder {
@BindsInstance fun app(app : Application) : Builder
fun build() : AndroidTestComponent
}
}
Создать тестовое приложение:
class AndroidTestApp : DaggerApplication() {
override fun onCreate() {
super.onCreate()
Timber.plant(Timber.DebugTree())
}
override fun applicationInjector(): AndroidInjector<out DaggerApplication> =
DaggerAndroidTestAppComponent.builder().app(this).build()
}
затем бегун:
class AndroidTestAppJunitRunner : AndroidJUnitRunner() {
override fun newApplication(cl: ClassLoader?, className: String?, context: Context?): Application {
return super.newApplication(cl, AndroidTestApp::class.java.canonicalName, context)
}
}
включить в android закрытие в Gradle:
testInstrumentationRunner "com.package.name.AndroidTestAppJunitRunner"
добавьте эти зависимости:
kaptAndroidTest "com.google.dagger:dagger-compiler:$daggerVersion"
kaptAndroidTest "com.google.dagger:dagger-android-processor:$daggerVersion"
androidTestImplementation "org.mockito:mockito-android:2.27.0"
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test:rules:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
затем тест:
@RunWith(AndroidJUnit4::class) class LoginActivityTest {
@Rule
@JvmField
val activityRule = ActivityTestRule<LoginActivity>(LoginActivity::class.java, false, false)
@Before
fun beforeEach() {
Mockito.doReturn(NOT_SIGNED).`when`(AndroidTestModule.mock).getUserSignedStatus(ArgumentMatchers.anyBoolean()
}
@Test
fun buttonLogin() {
activityRule.launchActivity(Intent())
onView(withText("Google")).check(matches(isDisplayed()));
}
}
Затем ваша зависимость будет предоставлена через сгенерированный график тестовых компонентов в LoginActivity