我正在尝试使用 mockito 对存储库进行测试,但出现此错误
这是我的仓库
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)
}
}
我一直试图在互联网上找到解决方案,花了很多时间,请帮忙
答案 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)
}
}