Myk*_*ola 5 mvp android mockito kotlin dagger-2
我经常kotlin.UninitializedPropertyAccessException: lateinit property xxx has not been initialized参加我的 Mockito 测试。但该应用程序运行良好。注意:我不想将演示者注入到活动中。提前致谢!
这是我的活动:
class CreateAccountActivity : AppCompatActivity(), CreateAccountView {
private var presenter: CreateAccountPresenter? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_create_account)
presenter = CreateAccountPresenter()
((application) as CariumApp).getDaggerComponent().inject(presenter!!)
presenter?.attachView(this)
}
Run Code Online (Sandbox Code Playgroud)
这是我的主持人:
class CreateAccountPresenter {
private var view: CreateAccountView? = null
@Inject
lateinit var dataManager: DataManager
fun attachView(view: CreateAccountView) {
this.view = view
dataManager.getServiceDocuments(true, object : GetServiceDocumentsListener {
// ...
})
}
Run Code Online (Sandbox Code Playgroud)
这是我的数据管理器:
interface DataManager {
fun getServiceDocuments(latest: Boolean, listener: GetServiceDocumentsListener)
}
Run Code Online (Sandbox Code Playgroud)
和 AppDataManager:
Singleton
class AppDataManager @Inject constructor(context: Context) : DataManager {
// ...
}
Run Code Online (Sandbox Code Playgroud)
最后我的测试失败了:
class CreateAccountPresenterTest {
val mockDataManager: DataManager = mock()
val mockCreateAccountView: CreateAccountView = mock()
private val createAccountPresenter = CreateAccountPresenter()
@Test
fun getServiceDocuments() {
doAnswer {
val args = it.arguments
(args[1] as GetServiceDocumentsListener).onError()
null
}.`when`(mockDataManager).getServiceDocuments(Mockito.anyBoolean(), anyOrNull())
createAccountPresenter.attachView(mockCreateAccountView)
verify(mockCreateAccountView).hideLoadingDialog()
}
}
Run Code Online (Sandbox Code Playgroud)
毕业文件:
testImplementation 'junit:junit:4.12'
testImplementation 'org.mockito:mockito-core:2.22.0'
testImplementation "org.mockito:mockito-inline:2.22.0"
testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.0.0-RC1"
implementation 'com.google.dagger:dagger:2.16'
kapt 'com.google.dagger:dagger-compiler:2.16'
Run Code Online (Sandbox Code Playgroud)
我的模块类:
@Module
open class MyModule(private var context: Context) {
@Provides
open fun provideContext(): Context {
return context
}
@Provides
@Singleton
internal fun provideDataManager(appDataManager: AppDataManager): DataManager {
return appDataManager
}
}
Run Code Online (Sandbox Code Playgroud)
实际错误是kotlin.UninitializedPropertyAccessException: lateinit property dataManager has not been initialized
哪里有DataManager @Provides方法啊?Dagger 可识别@Inject内部构造函数AppDataManager,但无法将其识别为接口。为 Dagger 创建抽象并使用的模块@Binds
https://proandroiddev.com/dagger-2-annotations-binds-contributesandroidinjector-a09e6a57758f
| 归档时间: |
|
| 查看次数: |
4098 次 |
| 最近记录: |