0

我正在尝试进行一些测试,我需要通过在 KODEIN 上覆盖它来替换真正的依赖项,但它不起作用,我不知道我还能做什么。

这是我的依赖关系图(我省略了其他依赖关系):

class Injector(private val context: Context) {

    val dependencies = Kodein.lazy {

        .
        .
        bind<RetrieveContacts>() with provider {
            Log.i("RetrieveContacts","REAL")
            RetrieveContactsInMemory()
        }
        .
        .     
    }
}

这是我的应用程序类:

class AppApplication : Application(), KodeinAware {

   override val kodein by Injector(this).dependencies
}

这是我为覆盖依赖项所做的工作:

@RunWith(value = AndroidJUnit4::class)
class HomeActivityEmptyStateTest {

    @get:Rule
    var mActivityTestRule = ActivityTestRule<HomeActivity>(HomeActivity::class.java)

    @Before
    fun setup() {

        val appApplication = InstrumentationRegistry.getInstrumentation().targetContext

        val kodein by Kodein.lazy {

            extend(appApplication.appKodein())

            bind<RetrieveContacts>(overrides = true) with provider {
                Log.i("RetrieveContacts","FAKE")
                RetrieveEmptyContacts()
            }
        }
    }

    @Test
    fun testWhenHasNoContent() {
        ...
    }

}

我仍然在控制台日志中看到“RetrieveContacts REAL”而不是“RetrieveContacts FAKE”

4

2 回答 2

1

在扩展测试时,您似乎忘记了允许覆盖。

extend(appApplication.appKodein(), allowOverride = true)
于 2018-06-17T10:48:14.800 回答
0

这不起作用,因为不会覆盖父母定义。更多信息:https ://kodein.org/Kodein-DI/?6.1/core#_overridden_​​access_from_parent

这是因为 Bar 绑定到单例,第一次访问将定义使用的容器(父或子)。如果单例是由孩子初始化的,那么随后来自父母的访问将产生一个带有对 Foo2 的引用的 Bar,该 Foo2 不应该存在于父母中。

于 2021-07-22T08:23:01.920 回答