Mah*_*zad 11 android unit-testing dependency-injection kotlin dagger-2
要定义单例,应该使用kotlin对象声明还是使用普通的kotlin类并使用匕首注入它?我认为第一种选择肯定更容易,但是在这种情况下我可能不知道使用匕首的原因。
选项1(notice object关键字):
object SomeUtil {
// object state (properties)
fun someFunction(number: Long) {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
选项2(notice class关键字):
class SomeUtil {
// object state (properties)
fun someFunction(number: Long) {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
@Module
class AppModule {
@Provides
@Singleton
internal fun provideTheUtil() = SomeUtil()
}
Run Code Online (Sandbox Code Playgroud)
class MainActivity : BaseActivity() {
@Inject internal lateinit var util: SomeUtil
}
Run Code Online (Sandbox Code Playgroud)
更新2019-07-03
@Blackbelt在评论中说,为了可测试性,我们应该选择选项2。但是,像图书馆MockK可以嘲笑object小号了。那么您是否仍然认为选项2是首选?
NumberFormatUtil您可能想重新考虑成为单身人士的必要性。如果直接与Dagger甚至没有任何瞄准镜的工厂@Reusable一起使用可能会更便宜。
如果NumberFormatUtil相当简单并且只提供一些实用方法,没有状态并且不需要在测试中进行模拟,那么您可以使用一个object实现,也许@JvmStatic用于Java互操作性。但是,您也可以使用全局实用程序(扩展)函数:
package xyz
fun formatNumber(number: Long) {
// ...
}
fun Long.format() = formatNumber(this)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
531 次 |
| 最近记录: |