在单元测试中模拟 Glide 以避免 NullPointerException
Mocking Glide in Unit Test to avoid NullPointerException
我正在为使用 Glide 从服务器获取图像的 viewModel 编写单元测试。
代码如下:
ViewModel.kt
class MyViewModel : ViewModel() {
val repository = Repository()
fun updateState() {
viewModelScope.launch {
val drawable = repository.getImage("google.com")
withContext(Dispatchers.Main()) {
if(drawable != null) _liveData.value = LoadedState
}
}
}
}
存储库:
class Repository {
fun getImage(url: String) {
return Glide.with(appContext).asDrawable().load(url).submit().get()
}
}
测试:
@Test
fun testLoadedState() {
runBlockingTest {
whenever(repository.getImage("")).thenReturn(mockedDrawable)
... rest of the test
}
}
根据 运行 测试,我在执行 glide 时得到 NULL POINTER EXCEPTION。错误是
java.lang.NullPointerException
at com.bumptech.glide.load.engine.cache.MemorySizeCaculator.isLowMemoryDevifce(MemorySizeCalculator.java:124)
我假设我收到此错误是因为我需要模拟 Glide 对象。当在测试中执行 repository.getImage() 时,我怎样才能摆脱这个错误,只 return 模拟 bitmap/null 图像?
您实际上并没有模拟您正在使用的存储库,因为您在 viewModel 中创建了该存储库。
为了模拟存储库,您必须将其注入到视图模型中,然后您可以在测试中使用模拟的。
class MyViewModel(private val repository: Repository) : ViewModel() {
...
然后在您的测试中注入模拟存储库:
@Test
fun testLoadedState() {
runBlockingTest {
val viewModel = ViewModel(mockRepository)
whenever(mockRepository.getImage("")).thenReturn(mockedDrawable)
... rest of the test
}
}
我正在为使用 Glide 从服务器获取图像的 viewModel 编写单元测试。 代码如下:
ViewModel.kt
class MyViewModel : ViewModel() {
val repository = Repository()
fun updateState() {
viewModelScope.launch {
val drawable = repository.getImage("google.com")
withContext(Dispatchers.Main()) {
if(drawable != null) _liveData.value = LoadedState
}
}
}
}
存储库:
class Repository {
fun getImage(url: String) {
return Glide.with(appContext).asDrawable().load(url).submit().get()
}
}
测试:
@Test
fun testLoadedState() {
runBlockingTest {
whenever(repository.getImage("")).thenReturn(mockedDrawable)
... rest of the test
}
}
根据 运行 测试,我在执行 glide 时得到 NULL POINTER EXCEPTION。错误是
java.lang.NullPointerException
at com.bumptech.glide.load.engine.cache.MemorySizeCaculator.isLowMemoryDevifce(MemorySizeCalculator.java:124)
我假设我收到此错误是因为我需要模拟 Glide 对象。当在测试中执行 repository.getImage() 时,我怎样才能摆脱这个错误,只 return 模拟 bitmap/null 图像?
您实际上并没有模拟您正在使用的存储库,因为您在 viewModel 中创建了该存储库。
为了模拟存储库,您必须将其注入到视图模型中,然后您可以在测试中使用模拟的。
class MyViewModel(private val repository: Repository) : ViewModel() {
...
然后在您的测试中注入模拟存储库:
@Test
fun testLoadedState() {
runBlockingTest {
val viewModel = ViewModel(mockRepository)
whenever(mockRepository.getImage("")).thenReturn(mockedDrawable)
... rest of the test
}
}