Почему я получаю org.mockito.exceptions.misusing.CannotStubVoidMethodWithReturnValue? - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь изучать 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)
    }
}

Этот метод имеет тип возвращаемого значения, поэтому он не должен быть частью проблемы.Я надеюсь, что кто-то может объяснить мне, что происходит, когда я в тупике.Это как-то связано с тем, что я вызываю этот метод в лямбде?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...