【发布时间】:2020-05-01 08:37:42
【问题描述】:
我正在尝试创建 Espresso 测试并使用 mockWebServer 问题是,当我尝试创建 mockWebServer 时,它会调用真正的 api 调用,我想拦截它并模拟响应。
我的匕首组织是:
我的应用
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。
【问题讨论】:
-
请使用扩展您的 AbstractBaseTest 的类的构造函数代码编辑您的问题
标签: android kotlin android-espresso dagger-2 dagger