存根时出现空指针异常

Null pointer exception when stubbing

下午好,存根时出现空指针异常

<pre><code>package com.micheladrien.android.fresquerappel import android.app.Application import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.micheladrien.fresquerappel.R import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.Mockito.`when` import org.mockito.Mockito.mock import org.mockito.junit.MockitoJUnitRunner @RunWith(MockitoJUnitRunner::class) class MainViewModelTest { @Rule @JvmField var instantTaskExecutorRule = InstantTaskExecutorRule() @Mock val applicationMock: Application = mock(Application::class.java) @Before fun setUpTaskDetailViewModel() { `when`(applicationMock.getString(R.string.collage_climat)).thenReturn("Climat") } }

编辑:我需要存根函数 when(applicationMock.getString(R.string.collage_climat)).thenReturn("Climat") 因为我的视图模型将从上下文中获取字符串。

根据此博客 post :https://codepills.com/2018/05/10/3-basic-mistakes-for-nullpointerexception-when-mock/ 我应该将 when thenreturn 替换为 when then (answer) 如果它是真的,为什么?

我已经测试过:将 R.id 值更改为原始数字。 =>同样的错误 在 @Mock => 相同的错误

中模拟文件之前并使用 lateinit 进行声明

不同于之前的问题线程 我直接存根这个方法。不存根另一个方法的对象的方法。

如有任何帮助,我们将不胜感激。

编辑:我要测试的虚拟机:

class MainViewModel(application: Application): AndroidViewModel(application), WaitingViewModel{

    private val _name = MutableLiveData<String>().apply {
        value = application.getString(R.string.collage_climat)
    }

    val name : LiveData<String> = _name

    override fun notifyNewCollage(collage_name: String) {
        _name.value = collage_name
    }

}

这里是 gradle 如果你想检查 Mockito 版本: </p> <pre><code>dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation 'androidx.core:core-ktx:1.3.2' implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'com.google.android.material:material:1.2.1' implementation 'androidx.constraintlayout:constraintlayout:2.0.3' def navigation_version = '2.3.1' implementation "androidx.navigation:navigation-fragment-ktx:$navigation_version" implementation "androidx.navigation:navigation-ui-ktx:$navigation_version" implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation "androidx.navigation:navigation-fragment:$navigation_version" implementation "androidx.navigation:navigation-ui:$navigation_version" implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' implementation 'androidx.annotation:annotation:1.1.0' implementation 'androidx.recyclerview:recyclerview:1.1.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.2' implementation 'il.co.theblitz:observablecollections:1.4.2' def espressocore_version = '3.3.0' androidTestImplementation "androidx.test.espresso:espresso-core:$espressocore_version" androidTestImplementation "androidx.test.espresso:espresso-core:$espressocore_version" androidTestImplementation "android.arch.core:core-testing:$lifecycle_version" def mockito_version = '3.5.5' // For local unit tests on your development machine (also tested on 3.3.3) testImplementation "org.mockito:mockito-core:$mockito_version" // For instrumentation tests on Android devices and emulators androidTestImplementation "org.mockito:mockito-android:$mockito_version" androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test:rules:1.0.2' }

Mockito 建议不要模拟你不拥有的 类。所以应用程序模拟不是一个好主意。 Junit 可以为您提供所需的应用程序上下文:https://developer.android.com/training/testing/junit-runner

有关存根失败的其他信息,