mockito 在单元测试中模拟滑动以避免NullPointerException

ia2d9nvy  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(142)

我正在为一个viewModel编写单元测试,这个viewModel使用Glide从服务器获取一个图像。代码如下:

查看模型.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()时只返回一个模拟位图/空图像?

guicsvcw

guicsvcw1#

您实际上并不是在模仿您正在使用的存储库,因为您是在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 
   }
}

相关问题