Android Mockito kotlin. UninitializedPropertyAccessException: свойство данных lateinitManager не было инициализировано - PullRequest
0 голосов
/ 14 сентября 2018

Я постоянно получаю kotlin.UninitializedPropertyAccessException: lateinit property xxx has not been initialized в моем тесте Мокито.Но приложение работает просто отлично.Примечание. Я не хочу вводить докладчика в действие.Заранее спасибо!

Вот моя активность:

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 { 
       // ...
    })
}

Вот мой DataManager:

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

Фактическая ошибка kotlin.UninitializedPropertyAccessException: свойство свойства lateinitManager не было инициализировано

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Вы не назначаете свой макет на поле.Назначьте это в вашем методе испытаний.Перед звонком attachView()

createAccountPresenter.dataManager = mockDataManager
0 голосов
/ 14 сентября 2018

Где у вас метод DataManager @Provides?Кинжал распознает конструктор @Inject внутри AppDataManager, но не может распознать его как интерфейс.Создать модуль для Dagger, который является абстрактным и использует @Binds

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

...