在Arrow Kt Documentation on Dependency Injection中,依赖是在“世界边缘”定义的,或者在 Android 中可以是 anActivity
或 a Fragment
。所以给定的例子如下:
import Api.*
class SettingsActivity: Activity {
val deps = FetcherDependencies(Either.monadError(), ActivityApiService(this))
override fun onResume() {
val id = deps.createId("1234")
user.text =
id.fix().map { it.toString() }.getOrElse { "" }
friends.text =
deps.getUserFriends(id).fix().getOrElse { emptyList() }.joinToString()
}
}
但现在我在想SettingsActivity
这个例子中的怎么可能是unit tested
?由于依赖项是在活动中创建的,因此不能再更改它以进行测试?
当使用其他一些Dependency Injection
库时,这个依赖定义是在将要使用的类之外创建的。例如,在 中Dagger
,创建了一个Module
类来定义如何创建对象(依赖项),并使用一个类@Inject
来“注入”模块内部定义的依赖项。所以现在当单元测试时Activity
,我只需要定义一个不同的模块或手动将依赖项的值设置为一个模拟对象。