在单元测试中模拟 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 
   }
}