测试存储库返回 NullPointerException - 单元测试

时间:2021-07-21 18:38:45

标签: android-studio unit-testing kotlin

我正在尝试使用 mockito 对存储库进行测试,但出现此错误 error log

这是我的仓库

interface DiscoverRepository{
  suspend fun trendingMovie():ResultData<Discover?>
}

在这里我写了实现

class RemoteDiscoverRepository @Inject constructor(private val retrofitServices: RetrofitServices) :
DiscoverRepository {

private suspend fun remote(remote:Response<Discover>) : ResultData<Discover?>{
    val request = withContext(Dispatchers.IO) { remote }

    return when(request.code()){
        200 -> ResultData(
            true,
            null,
            request.body()
        )

        else -> ResultData(
            false,
            request.body()?.status_message,
            null
        )
    }
}

override suspend fun trendingMovie(): ResultData<Discover?> {
    return remote(retrofitServices.discover().trendingMovieOfTheDay())
}
}

这是改造服务

interface RetrofitServices {
 fun discover(): DiscoverDao
}

class RetrofitServicesImpl @Inject constructor(private val retrofit: Retrofit):RetrofitServices{
  override fun discover(): DiscoverDao {
      return retrofit.create(DiscoverDao::class.java)
  }
}

然后是我的存储库测试

@RunWith(MockitoJUnitRunner::class)
class DiscoverRepositoryTest {
  @get:Rule
  var instantTaskExecutorRule = InstantTaskExecutorRule()

  @Mock
  private lateinit var discoverRepository: DiscoverRepository

  @Mock
  private lateinit var retrofitServices: RetrofitServices

  private lateinit var remote : RemoteDiscoverRepository

  private val dummy = DiscoverDummy.getDiscover()


  @Before
  fun setup(){
      remote = RemoteDiscoverRepository(retrofitServices)
  } 


  @Test
  fun trendingMovieTest() = runBlocking {
    `when`(remote.trendingMovie()).thenReturn(dummy)
    val trending = discoverRepository.trendingMovie()
    verify(remote).trendingMovie()
    assertNotNull(trending)
    assertEquals(dummy.data?.results?.size, trending.data?.results?.size)
  }
}

我一直试图在互联网上找到解决方案,花了很多时间,请帮忙

1 个答案:

答案 0 :(得分:0)

啊,我通过像这样创建类假存储库来解决这个问题

class FakeRepository(private val remoteDiscoverRepository:RemoteDiscoverRepository):DiscoverRepository {
 override suspend fun trendingMovie(): ResultData<Discover?> {
    return remoteDiscoverRepository.trendingMovie()
 }

 override suspend fun popularMovie(): ResultData<Discover?> {
    return remoteDiscoverRepository.popularMovie()
 }

 override suspend fun topRateTvShow(): ResultData<Discover?> {
    return remoteDiscoverRepository.topRateTvShow()
 }

 override suspend fun latestMovie(): ResultData<Discover?> {
    return remoteDiscoverRepository.latestMovie()
 }

 override suspend fun latestTvShow(): ResultData<Discover?> {
     return remoteDiscoverRepository.latestTvShow()
 }

 override suspend fun tvPopular(): ResultData<Discover?> {
     return remoteDiscoverRepository.tvPopular()
 }
}

然后初始化我的测试代码

@RunWith(MockitoJUnitRunner::class)
class DiscoverRepositoryTest {
 
 @get:Rule
 var instantTaskExecutorRule = InstantTaskExecutorRule()

 private val remote = Mockito.mock(RemoteDiscoverRepository::class.java)

 private val discoverRepository = FakeRepository(remote)

 private val dummy = DiscoverDummy.getDiscover()



 @Test
 fun trendingMovieTest() = runBlocking {
    `when`(remote.trendingMovie()).thenReturn(dummy)
    val trending = discoverRepository.trendingMovie()
    verify(remote).trendingMovie()
    assertNotNull(trending)
    assertEquals(dummy.data?.results?.size, trending.data?.results?.size)
 }
}