浓缩咖啡单元测试 NullPointerException

时间:2021-03-02 08:33:17

标签: android unit-testing kotlin

我的单元测试有问题。 从单元测试中设置最喜欢的值时,但始终返回 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)

如何解决?

1 个答案:

答案 0 :(得分:0)

您应该设置 diskIO() 以返回实际值,例如:

when(appExecutors.diskIO()).thenReturn(someActualValue)

如果没有设置,diskIO() 会返回默认值 null,并且在 null 上调用函数(执行)会产生异常。