我的单元测试有问题。 从单元测试中设置最喜欢的值时,但始终返回 NullPointerException。
这是我的仓库:
class FakeFilmRepository(
private val remoteDataSource: RemoteDataSource,
private val localDataSource: LocalDataSource,
private val appExecutors: AppExecutors) : FilmDataSource {
override fun setFilmFavorite(film: FilmEntity, state: Boolean) =
appExecutors.diskIO().execute { localDataSource.setFilmFavorite(film, state) }}
这是我的单元测试:
class FilmRepositoryTest {
@get:Rule
var instantTaskExecutorRule = InstantTaskExecutorRule()
private val remote = mock(RemoteDataSource::class.java)
private val local = mock(LocalDataSource::class.java)
private val appExecutors = mock(AppExecutors::class.java)
private val filmRepository = FakeFilmRepository(remote, local, appExecutors)
private val movieResponses = DataDummy.generateRemoteDummyMovies()
private val movieId = movieResponses[0].id
private val movieCastResponses = DataDummy.generateRemoteDummyCasts(movieId)
@Mock
private lateinit var observer: Observer<FilmWithCast>
@Test
fun setFavoriteFilm() {
val dummyFilmWithCast = Resource.success(DataDummy.generateDummyFilmWithCasts(DataDummy.generateDummyMovies()[0], false))
val film = MutableLiveData<Resource<FilmWithCast>>()
film.value = dummyFilmWithCast
`when`(filmRepository.getFilmWithCasts(movieId)).thenReturn(film)
val castResource = film.value
if (castResource != null) {
val filmWithCast = castResource.data
if (filmWithCast != null) {
val filmEntity = filmWithCast.mFilm
val newState = !filmEntity.favorite
filmRepository.setFilmFavorite(DataDummy.generateDummyMovies()[0], newState) //ERROR NULL
}
}
verify(observer).onChanged(dummyFilmWithCast.data)
} }
结果错误为空:
java.lang.NullPointerException
at com.pamungkasrizall.films.data.FakeFilmRepository.setFilmFavorite(FakeFilmRepository.kt:188)
at com.pamungkasrizall.films.data.FilmRepositoryTest.setFavoriteFilm(FilmRepositoryTest.kt:115)
如何解决?
答案 0 :(得分:0)
您应该设置 diskIO() 以返回实际值,例如:
when(appExecutors.diskIO()).thenReturn(someActualValue)
如果没有设置,diskIO() 会返回默认值 null,并且在 null 上调用函数(执行)会产生异常。