android - 存根时出现空指针异常
问题描述
下午好,存根时出现空指针异常
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") 因为我的视图模型将从上下文中获取字符串。
根据这篇博文:https://codepills.com/2018/05/10/3-basic-mistakes-for-nullpointerexception-when-mock/ 我应该在 thenreturn 到 when then (答案)时替换,如果它是真的,为什么 ?
我已经测试过:将 R.id 值更改为粗略的数字。=>相同的错误在之前模拟文件并在@Mock处使用lateinit进行声明=>相同的错误
与之前的问题线程Mockito - 存根方法 时的 NullpointerException 不同,我直接存根方法。不存根另一个方法的对象的方法。
任何帮助将不胜感激。
编辑:我要测试的虚拟机:
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
}
}
如果你想检查 Mockito 版本,这里是 gradle:
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
有关存根失败的其他信息,Mockito 在存根上失败:它尝试执行应该存根的函数
推荐阅读
- python - 计算列表字典中的值并使用 pandas 连接输出的键和值名称
- javascript - Javascript 问题 - 未捕获的类型错误:无法读取未定义的属性 'incart'
- python - Python中的均方位移
- r - dplyr 的“cummean()”函数未按预期提供结果
- java - 如何从文本视图中获取数据并从对话框中获取复选框?
- angular - Angular 8 - 在生产版本中用内联 base64 替换图像 URL
- javascript - Dropzone.js 未显示在 vue-js-modal 中
- postgresql - 使用 Sequelize 和 PostgreSQL 设置数据库连接
- dart - 在dart中抓取网页时如何获取href属性的值?
- python - Python为什么我的变量leap_counter返回UnboundLocalError错误信息?