Как вы тестируете метод viewmodel, который использует rx java и возвращает void? - PullRequest
0 голосов
/ 10 февраля 2020

Здравствуйте, у меня есть эта модель представления, которую я хочу проверить. У меня есть класс обслуживания, который использует rx java Я получаю данные и передаю их непосредственно адаптеру, но мой обратный вызов onsuccess никогда не получает обратный вызов, как я могу это исправить?

Вот код для модели представления:

class NewsViewModel(private val dataManager: DataManager) : ViewModel() {
    private val disposables: CompositeDisposable = CompositeDisposable()
    private lateinit var country: String
    val newsListAdapter = NewsAdapter(this)

    private val urlMutableLiveData = MutableLiveData<String>()
    val urlLiveData: LiveData<String>
        get() = urlMutableLiveData

    fun loadNews(query: String) {
        this.country = query
        disposables.add(
            dataManager.getNewsList(query, APIKEY)
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe { result -> onRetrieveNewsListSuccess(result as List<News>) }
        )
    }

    fun onNewsClick(articleViewModel: ArticleViewModel) {
        urlMutableLiveData.value = articleViewModel.articleLink.value
    }

    override fun onCleared() {
        disposables.clear()
    }

    private fun onRetrieveNewsListSuccess(newsList:List<News>) {
        newsListAdapter.updateNewsList(newsList)
    }
}

и это мой тест:

@RunWith(MockitoJUnitRunner::class)
class NewsListViewModelTest {

    companion object {
        @ClassRule
        @JvmField
        val schedulers = RxImmediateSchedulerRule()
    }
    @Rule
    @JvmField
    var rule = MockitoJUnit.rule()

    val dataManager = mockk<DataManager>(relaxed = true)
    val newsAdapter = mockk<NewsAdapter>(relaxed = true)

    private lateinit var  newsListViewModel: NewsViewModel

    @Before
    fun setUp() {
        newsListViewModel = NewsViewModel(dataManager)
    }

    @Test
    fun loadNews() {
        val newsList = mutableListOf(News("author", "title", "image", "link", Source("name")))
        every { dataManager.getNewsList("country", "apiKey") } returns Observable.just(newsList)

        newsListViewModel.loadNews("us")
        verify { newsAdapter.updateNewsList(newsList) }
    }
}

Как это исправить, чтобы rx java вернул обратный вызов. В настоящее время я получаю эту ошибку:

java.lang.AssertionError: Verification failed: call 1 of 1: NewsAdapter(#2).updateNewsList(eq([News(author=author, title=title, urlToImage=image, url=link, source=Source(name=name))]))) was not called

Заранее спасибо.

Привет

...