当前位置: 首页 > 知识库问答 >
问题:

(DAGGER-ANDROID)不能在浓缩咖啡测试中使用@inject,也不能使用mockWebServer

喻高寒
2023-03-14

我试图创建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
    }
}
@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”,我不知道是否需要其他模块。

class TestRunner : AndroidJUnitRunner() {

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

}
@Inject
lateinit var okHttpClient: OkHttpClient

因为它说它没有初始化。

我的mockWebServer甚至没有分发响应--尽管它没有指向真正的api调用,而是指向我放在TestRetrofitModule中的调用,问题是我必须链接mockWebServer和Retrofit。

共有1个答案

苏高远
2023-03-14

您发布的设置看起来正确。至于没有提供app,您可能需要在组件中绑定它,因为现在只绑定testapp。所以你需要替换

fun create(@BindsInstance application: TestApp): TestAppComponent

fun create(@BindsInstance application: App): TestAppComponent
 类似资料:
  • 我目前正在尝试添加Espresso UI测试到我的Android应用程序,我希望能够通过它的提示字段目标TextInputEditText,然后点击它并输入一些文本。(我知道目标ID是更好的做法,但在本例中,我需要目标提示) 以下是我尝试这样做的方法: 但是,当尝试执行此操作时,我会得到以下错误: TextInputEditText{id=2131820762,res-name=input_dat

  • 浓缩咖啡测试很烦人,因为像这样的代码 给出如下错误

  • 在最近迁移到Dagger2之后,我正在开发的应用程序的每个功能都使用了@ActivityScope。每个应用程序特性都是使用MVP模式实现的,并且有自己的本地dagger组件设置,它依赖于应用程序组件,以获得整个应用程序生命周期(由应用程序提供)所需的依赖关系。每个特性的activity都将一个提供主要应用程序组件的基类扩展到一个由每个activity覆盖的方法,以便设置本地dagger组件(构建

  • 我在做Espresso测试时遇到了一个问题,我知道Espresso不能处理动画,所以我在下面做了。-禁用我的测试设备窗口动画,过渡动画和动画师持续时间比例都设置为关闭(这不起作用)-然后我试图在我的代码中添加一个标志(如。espresso_testing=true。如果为true,我的代码将跳过调用所有startAnimation()函数调用。--->这很管用。然而,在编写espresso测试用例

  • null 动画/转换被禁用,但这不会阻止CircularProgressLayout动画化。 我尝试,但即使这样,在第一次单击和第二次单击之间也要等待2秒。 我还试图滥用作为黑客来确认退出应用程序。这确实有效,但这是一个黑客。我只想让浓缩咖啡点击两次。 有什么建议如何使浓缩咖啡点击两次而不等待动画?

  • 我有一个矢量绘图,我想用浓咖啡测试。 矢量可绘制:ic_video_24dp 我有没有办法用浓缩咖啡对矢量绘图进行UI测试?任何帮助都将不胜感激。