gpt4 book ai didi

使用 KodeIn 进行 Android Instrumented 测试

转载 作者:行者123 更新时间:2023-12-04 23:49:03 27 4
gpt4 key购买 nike

我们有一个 Android 应用程序使用 compose 作为 View 层,并且我们使用 Kodein 进行所有依赖注入(inject)。
我有一个 DIAware BaseApplication 类:

class BaseApplication : Application(), DIAware {
override val di: DI = DI.lazy {
import(modules) // modules defined in respective packages
}
}
我还有一个 MainActivity 和一个导航图来管理各种可组合项之间的导航。
问题 :
如何在 MainActivity 的检测测试中正确覆盖这些模块?
@RunWith(AndroidJUnit4::class)
class MainActivityTest {
@get:Rule
val composeTestRule = createAndroidComposeRule<MainActivity>()

val moduleOverrides = DI.Module(allowSilentOverride = true) {
// add bindings for fakes w/ allowOverride = true
}

@Before
fun setup() {
val application =
ApplicationProvider.getApplicationContext() as BaseApplication

// how can I override the BaseApplication modules for my test?
}

}
我似乎找不到任何关于此事的明确语言,并且觉得我错过了一些非常明显的东西。任何帮助将不胜感激。

最佳答案

有几种方法可以实现这一目标。一般的方法是覆盖实际的模块,如

val someParrentKodeinModule...

val mockModule = Kodein {
extend(someParrentKodeinModule, allowOverride = true)
bind<Foo>(overrides = true) with provider { Foo2() }
}

or

val kodein = Kodein {
/* ... */
import(testsModule, allowOverride = true)
}
在哪里 testsModule是一些模块,它已经定义了所有需要的模拟组件,这些组件将在主组件中被覆盖。
你的方法也不错。关键是用需要的 DI 替换你的 DI - 这可以在你的应用程序中制作 DI - var而不是 val并赋予它新的值(value)。但是你必须放弃 DIAware
class BaseApplication : Application() {
var di: DI = DI.lazy {
import(modules) // modules defined in respective packages
}
}

@Before
fun setup() {
val application =
ApplicationProvider.getApplicationContext() as BaseApplication

application.di = moduleOverrides
}

类似的东西。
并且一般不建议在 App 类中对应用使用单个 DI。为您要测试的应用程序的每个组件使用专门的模块

关于使用 KodeIn 进行 Android Instrumented 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70101438/

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