Android单元测试报错:android.util.Log的isLoggable方法未Mock
解决“Method isLoggable in android.util.Log not mocked”测试报错
这个错误是因为JUnit单元测试环境中,Android SDK的android.util.Log类方法没有默认实现,调用时会抛出异常,以下是两种解决方式:
方式一:全局配置返回默认值
在Module级别的build.gradle文件的android块中添加testOptions配置,让所有未被Mock的Android SDK类方法返回默认值:
android { // 其他配置... testOptions { unitTests.returnDefaultValues = true } }
配置后,未Mock的Android方法会返回对应类型的默认值(如布尔值返回false,对象返回null),Log.isLoggable就不会触发异常。
方式二:针对性Mock Log类
如果不想全局开启默认值,可以用Mockito静态MockLog类,指定isLoggable方法的返回值。修改你的测试方法如下:
@Test fun `when Get Story Success`() = runTest { // 静态Mock Log类 mockStatic(Log::class.java).use { mockedLog -> mockedLog.`when` { Log.isLoggable(anyString(), anyInt()) }.thenReturn(true) val data: PagingData<ListStoryItem> = StoryPagingSource.snapshot(dummyStory) val expectedQuote = MutableLiveData<PagingData<ListStoryItem>>() expectedQuote.value = data Mockito.`when`(storyRepository.getStory(token)).thenReturn(expectedQuote) val mainViewModel = MainViewModel(storyRepository) val actualQuote: PagingData<ListStoryItem> = mainViewModel.getStory(token).getOrAwaitValue() val differ = AsyncPagingDataDiffer( diffCallback = StoryAdapter.DIFF_CALLBACK, updateCallback = noopListUpdateCallback, workerDispatcher = Dispatchers.Main, ) differ.submitData(actualQuote) Assert.assertNotNull(differ.snapshot()) Assert.assertEquals(dummyStory.size, differ.snapshot().size) Assert.assertEquals(dummyStory[0], differ.snapshot()[0]) } }
需要确保依赖中包含Mockito的inline扩展,在Module的build.gradle中添加:
testImplementation "org.mockito:mockito-inline:4.+"
内容的提问来源于stack exchange,提问作者Muhammad Agil Izzulhaq
相关产品推荐
相关产品推荐

