Дразнящая ViewModel в эспрессо - PullRequest
       50

Дразнящая ViewModel в эспрессо

0 голосов
/ 27 февраля 2019

Я пишу тест пользовательского интерфейса Espresso, который имитирует viewModel, ссылаясь на GithubBrowserSample

для чего используется "TaskExecutorWithIdlingResourceRule", объявив, что Junit Rule позаботится о IdlingResource?

Даже после ссылки на этот класс "TaskExecutorWithIdlingResourceRule" в моем проекте при сборке компилятор не выдает никакой ошибки, но когда я запускаю тестовый пример, он показывает Unresolved Error (s)

TaskExecutorWithIdlingResourceRule.kt

import androidx.arch.core.executor.testing.CountingTaskExecutorRule
import androidx.test.espresso.IdlingRegistry
import androidx.test.espresso.IdlingResource
import org.junit.runner.Description
import java.util.UUID
import java.util.concurrent.CopyOnWriteArrayList
import java.util.concurrent.TimeUnit

class TaskExecutorWithIdlingResourceRule : CountingTaskExecutorRule() {
    // give it a unique id to workaround an espresso bug where you cannot register/unregister
    // an idling resource w/ the same name.

    private val id = UUID.randomUUID().toString()
    private val idlingResource: IdlingResource = object : IdlingResource {
        override fun getName(): String {
            return "architecture components idling resource $id"
        }

        override fun isIdleNow(): Boolean {
            return this@TaskExecutorWithIdlingResourceRule.isIdle
        }

        override fun registerIdleTransitionCallback(callback: IdlingResource.ResourceCallback) {
            callbacks.add(callback)
        }
    }
    private val callbacks = CopyOnWriteArrayList<IdlingResource.ResourceCallback>()
    override fun starting(description: Description?) {
        IdlingRegistry.getInstance().register(idlingResource)
        super.starting(description)
    }

    override fun finished(description: Description?) {
        drainTasks(10, TimeUnit.SECONDS)
        callbacks.clear()
        IdlingRegistry.getInstance().unregister(idlingResource)
        super.finished(description)
    }

    override fun onIdle() {
        super.onIdle()
        for (callback in callbacks) {
            callback.onTransitionToIdle()
        }
    }
}

Mocktest

@RunWith(AndroidJUnit4::class)
class MockTest {

    @Rule
    @JvmField
    var activityRule = IntentsTestRule(SingleFragmentActivity::class.java, true, true)

    @Rule
    @JvmField
    val executorRule = TaskExecutorWithIdlingResourceRule()

    private lateinit var viewModel: SeriesFragmentViewModel
    private val uiModelList = mutableListOf<SeriesBaseUIModel>()
    private val seriesMutableLiveData = MutableLiveData<List<SeriesBaseUIModel>>()
    private val seriesFragment = SeriesFragment()

    @Before
    fun init(){
        viewModel = mock(SeriesFragmentViewModel::class.java)
        `when`(viewModel.seriesLiveData).thenReturn(seriesMutableLiveData)

        ViewModelUtil.createFor(viewModel)

        activityRule.activity.setFragment(seriesFragment)
        EspressoTestUtil.disableProgressBarAnimations(activityRule)
    }


    @Test
    fun testLoading()
    {
        //Thread.sleep(3000)

        uiModelList.add(ProgressUIModel())
        seriesMutableLiveData.postValue(uiModelList.toList())

        onView(withId(R.id.pod_series_recycler_view))
            .check(selectedDescendantsMatch(withId(R.id.pod_adapter_series_header_title), isDisplayed()))

        onView(withId(R.id.pod_series_recycler_view))
            .check(selectedDescendantsMatch(withId(R.id.pod_adapter_series_header_title), withText(R.string.pod_series_header_title_text)))

        onView(withId(R.id.pod_series_recycler_view))
            .check(selectedDescendantsMatch(withId(R.id.pod_adapter_series_header_description), isDisplayed()))


        onView(withId(R.id.pod_series_recycler_view))
            .check(selectedDescendantsMatch(withId(R.id.pod_adapter_series_header_title), withText("Hello")))


        Thread.sleep(5000)
    }
}

enter image description here enter image description here

...