Я пытаюсь изучать Mockito на Android и использую библиотеку mockito-kotlin от nhaarman.Я получаю странную ошибку Mockito, которая гласит:
"org.mockito.exceptions.misusing.CannotStubVoidMethodWithReturnValue: 'execute' является пустым методом , и он не может быть ошеломленным с возвращаемым значением"
Странно то, что я не заглушаю этот класс.Вот модульный тест, в котором возникла проблема.
@RunWith(JUnit4::class)
class PoiListViewModelTest {
@get:Rule
var instantTaskExecutorRule = InstantTaskExecutorRule()
//Mocks
@Mock lateinit var getPois: GetPois
@Mock lateinit var mapper: PoiMapper
@Mock lateinit var observer: Observer<List<Poi_Presentation>>
// Class being tested
lateinit var poiListViewModel: PoiListViewModel
@Before
fun setup() {
MockitoAnnotations.initMocks(this)
poiListViewModel = PoiListViewModel(getPois,mapper)
}
private fun stubMapper(poi_Domain: Poi_Domain, poiPresentation: Poi_Presentation) {
`when`(mapper.mapToPresentation(poi_Domain)).thenReturn(poiPresentation)
}
@Test
fun fetchAllPoisExecutesUseCaseOnStart(){
verify(getPois, times(1)).execute(any(), eq(null))
}
@Test
fun poiSubscriberOnNextMapsCorrectly(){
val poiDomains = TestDataFactory.makePoiDomainList(2)
val poiPresentations = TestDataFactory.makePoiPresentationList(2)
stubMapper(poiDomains[0],poiPresentations[0])
poiListViewModel.getAllPois().observeForever(observer)
poiListViewModel.PoiSubscriber().onNext(poiDomains)
assertEquals(poiListViewModel.getAllPois().value,poiPresentations)
}
}
А вот мой класс тестируется:
open class PoiListViewModel @Inject constructor(
private val getPois: GetPois,
private val mapper: PoiMapper
) : ViewModel() {
private val poiData: MutableLiveData<List<Poi_Presentation>> = MutableLiveData()
init {
fetchAllPois()
}
fun getAllPois(): LiveData<List<Poi_Presentation>> {
return poiData
}
fun fetchAllPois() {
getPois.execute(PoiSubscriber())
}
override fun onCleared() {
getPois.dispose()
super.onCleared()
}
inner class PoiSubscriber: DisposableObserver<List<Poi_Domain>>(){
override fun onComplete() {
Log.i("poiSubscriber: ", "completed")
}
override fun onNext(data: List<Poi_Domain>) {
poiData.postValue(data.map {
mapper.mapToPresentation(it)
})
}
override fun onError(e: Throwable) {
Log.e("Obervable error: ", e.localizedMessage )
}
}
}
Это короткий модульный тест, и вы можете видеть, что я не пытается выполнить заглушку, так почему же Mockito выдаёт мне эту ошибку?метод execute запускается, когда создается мой тестовый класс get, но я использовал фиктивный объект (getPois), поэтому метод по умолчанию ничего не должен делать, правильно?Странно, ошибка возникает, когда я пытаюсь заглушить другой класс PoiMapper.Вот этот класс:
open class PoiMapper @Inject constructor() {
fun mapToPresentation(domainModel: Poi_Domain): Poi_Presentation {
return Poi_Presentation(domainModel.id,domainModel.name,domainModel.description,
domainModel.img_url,domainModel.latitude,domainModel.longitude,domainModel.imgFocalpointX,
domainModel.imgFocalpointY,domainModel.collection,domainModel.collectionPosition,
domainModel.release,domainModel.stampText)
}
}
Этот метод имеет тип возвращаемого значения, поэтому он не должен быть частью проблемы.Я надеюсь, что кто-то может объяснить мне, что происходит, когда я в тупике.Это как-то связано с тем, что я вызываю этот метод в лямбде?