当前位置: 首页 > 知识库问答 >
问题:

未初始化属性访问异常:lateinit属性数据管理器尚未初始化

申阳伯
2023-03-14

我经常得到kotlin。UninitializedPropertyAccessException:lateinit属性xxx在我的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)
}

这是我的主持人:

class CreateAccountPresenter {
private var view: CreateAccountView? = null

@Inject
lateinit var dataManager: DataManager

fun attachView(view: CreateAccountView) {
    this.view = view

    dataManager.getServiceDocuments(true, object : GetServiceDocumentsListener { 
       // ...
    })
}

这是我的数据管理器:

interface DataManager {
    fun getServiceDocuments(latest: Boolean, listener: GetServiceDocumentsListener)
}

和AppDataManager:

Singleton
class AppDataManager @Inject constructor(context: Context) : DataManager {
// ...
}

最后,我的测试失败了:

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()
}
}

gradle文件:

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'

我的模块课程:

@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
}
}

实际错误是科特林。UninitializedPropertyAccessException:lateinit属性dataManager尚未初始化

共有2个答案

易俊友
2023-03-14

哪里有DataManager@提供的方法?Dagger可以识别@Inject内的构造函数AppDataManager,但无法将其识别为接口。为Dagger创建抽象的模块,并使用@Binds

https://proandroiddev.com/dagger-2-annotations-binds-contributesandroidinjector-a09e6a57758f

岳迪
2023-03-14

你没有将你的模拟分配给这个领域。将其分配到测试方法中。在调用attachView()之前

createAccountPresenter.dataManager = mockDataManager

 类似资料:
  • 我不知道这是怎么回事 主要活动 我遇到了这个问题 2022-03-18 09:18:27.393 13874-13874/com。实例githubuser2 E/AndroidRuntime:致命异常:主进程:com。实例githubuser2,PID:13874 java。lang.RuntimeException:无法启动活动组件信息{com.example.githubuser2/com.e

  • 我正在尝试使用Spring-boot+Vaadin创建一个web项目,并且希望使用spring-data-jpa和hibernate从PostgreSQL数据库中获取数据。 在我的Vaadin看来,我尝试自动连接我的服务类,但我总是得到null,而且eror堆栈跟踪没有告诉我原因。 数据库得我得配置: 视图和UI: pom.xml: 我的服务: 更新的解决方案:

  • 这是我的主要功能 我在我的主类中调用它,并且一切正常,我可以得到响应。 当我想为它编写测试时,我遇到了错误“kotlin.UninitializedPropertyAccessException:lateinit属性客户端尚未初始化”,有人能帮我吗?"

  • 我正在为DI与Dagger2的项目工作。我正在MVP架构中注入presenter。由于某种原因,当我构建应用程序时,它会出现错误:“LateInit property presenter has not been initialized”。我知道这意味着没有注射,但我不明白为什么。下面是我的代码: 应用程序类 家庭模块 AppComponent 房屋结构 如果需要任何关于代码的其他信息,请询问..

  • 当变量只在OnCreate中声明时,为什么我的片段不进入onCreateView?

  • 我的代码成功构建,但每当我运行它时都会出现异常。不知道为什么匕首2不初始化变量。请告诉我哪里错了。给出以下例外情况: UninitializedPropertyAccessException:lateinit属性databaseService尚未初始化 依赖关系: