我正在尝试创建 Espresso 测试并使用mockWebServer
事情是当我尝试创建我的mockWebServer
它调用真正的 api 调用,我想拦截它并模拟响应。
我的匕首组织是:
My App
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://本地主机:8080 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。