gpt4 book ai didi

android - (DAGGER-ANDROID) 不能在 Espresso 测试中使用 @Inject 并且不能使用 mockWebServer

转载 作者:行者123 更新时间:2023-12-02 11:54:24 26 4
gpt4 key购买 nike

我正在尝试创建 Espresso 测试并使用 mockWebServer问题是当我尝试创建我的 mockWebServer它调用真正的 api 调用,我想拦截它并模拟响应。

我的 Dagger 组织是:

我的应用

open class App : Application(), HasAndroidInjector {

lateinit var application: Application

@Inject
lateinit var androidInjector: DispatchingAndroidInjector<Any>

override fun androidInjector(): AndroidInjector<Any> = androidInjector

override fun onCreate() {
super.onCreate()
DaggerAppComponent.factory()
.create(this)
.inject(this)
this.application = this
}
}

然后是 MyAppComponent
@Singleton
@Component(
modules = [
AndroidInjectionModule::class,
AppModule::class,
RetrofitModule::class,
RoomModule::class,
AppFeaturesModule::class
]
)
interface AppComponent : AndroidInjector<App> {

@Component.Factory
interface Factory {
fun create(@BindsInstance application: App): AppComponent
}
}

然后我创建了这个 TestApp
class TestApp : App() {

override fun androidInjector(): AndroidInjector<Any> = androidInjector

override fun onCreate() {
DaggerTestAppComponent.factory()
.create(this)
.inject(this)
}
}

这是我的 TestAppComponent
@Singleton
@Component(
modules = [
AndroidInjectionModule::class,
AppModule::class,
TestRetrofitModule::class,
AppFeaturesModule::class,
RoomModule::class]
)
interface TestAppComponent : AppComponent {
@Component.Factory
interface Factory {
fun create(@BindsInstance application: App): TestAppComponent
}
}

注意:这里我创建了一个新模块,名为 TestRetrofitModule其中 BASE_URL 是“ http://localhost:8080”,我不知道我是否需要别的东西。

我还创建了 TestRunner
class TestRunner : AndroidJUnitRunner() {

override fun newApplication(
cl: ClassLoader?,
className: String?,
context: Context?
): Application {
return super.newApplication(cl, TestApp::class.java.name, context)
}

}

并将其放在 testInstrumentationRunner
问题 1

我不能使用
@Inject
lateinit var okHttpClient: OkHttpClient

因为它说它没有初始化。

问题 2(解决感谢 Skizo)

我的 mockWebServer 没有发送响应——尽管没有指向真正的 api 调用,而是指向了我已经放入 TestRetrofitModule 的那个,问题是我必须链接那个 mockWebServer 和 Retrofit。

最佳答案

您发布的设置看起来正确。至于App未提供,您可能需要在组件中绑定(bind)它,因为现在您正在绑定(bind) TestApp只要。所以你需要更换

fun create(@BindsInstance application: TestApp): TestAppComponent



fun create(@BindsInstance application: App): TestAppComponent

关于android - (DAGGER-ANDROID) 不能在 Espresso 测试中使用 @Inject 并且不能使用 mockWebServer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61539234/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com