Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

ActivityTestRule deprecated para AndroidX

Estou reabrindo este mesmo tema pois vi que não foi resolvido e fiquei com o mesmo problema.

Na aula https://cursos.alura.com.br/course/android-espresso-teste-interface/task/45997

Ele tem um problema em pegar o onView pois ainda não foi salvo o item de leilão, então define o inicio da activity como false no rule e abre ela depois de salvar no teste.

Porém com o:

@Rule
    public ActivityScenarioRule rule = new ActivityScenarioRule<>(ListaLeilaoActivity.class);

não ficou claro o que fazer...

6 respostas

Fala Douglas, de boa ?

Agora que você já definiu sua Rule, basta você fazer suas assertions com o Espresso

Matheus, como eu disse anteriormente, ele tem um problema em pegar o onView pois ainda não foi salvo o item de leilão. Ele tenta pegar um item que ainda não foi devolvido pela api...

Na aula ele seta um parametro no deprecated como false pra inicia a activity e no teste só depois de buscar o item na api ele faz o onView pra bater o retorno.

Nesse caso, a galera faz um thread.sleep para aguardar os dados do backend retornarem.

Ai depois disso tu deveria conseguir fazer os asserts, é algo bem comum

Da uma olhada em um que fiz

@RunWith(AndroidJUnit4::class)
@LargeTest
class MainActivityTest {

    @get:Rule
    val rule = ActivityScenarioRule(MainActivity::class.java)

    @Test
    fun happyPath() {

        verifyThatLoadingScreenIsDisplayed()

        verifyThatListScreenIsDisplayed()

        verifyThatNewReviewsFoundWhenScrollToLastPosition()

        verifyThatReviewDetailIsIsDisplayedWhenClickOnReview()
    }

    private fun verifyThatLoadingScreenIsDisplayed() {
        onView(withId(R.id.loadingLottieView))
            .check(matches(isDisplayed()))

        Thread.sleep(5000)
    }

    private fun verifyThatListScreenIsDisplayed() {
        onView(withId(R.id.review_list))
            .check(matches(isDisplayed()))

        onView(withId(R.id.review_list))
            .check(matches(reviewIsDisplayed(atPosition = 0, hasRating = 5)))

        onView(withId(R.id.review_list))
            .check(matches(reviewIsDisplayed(atPosition = 1, hasRating = 4, hasImage = true)))

        onView(withId(R.id.review_list))
            .check(matches(reviewListCount(10)))
    }

    private fun verifyThatNewReviewsFoundWhenScrollToLastPosition() {
        onView(withId(R.id.review_list)).perform(
            RecyclerViewActions.scrollToPosition<ReviewAdapter.ReviewViewHolder>(9)
        )

        Thread.sleep(5000)

        onView(withId(R.id.review_list))
            .check(matches(reviewListCount(20)))
    }

    private fun verifyThatReviewDetailIsIsDisplayedWhenClickOnReview() {
        onView(withId(R.id.review_list)).perform(
            RecyclerViewActions.actionOnItemAtPosition<ReviewAdapter.ReviewViewHolder>(9, click())
        )

        onView(withId(R.id.bottomSheetUser)).check(matches(isDisplayed()))
    }

entendi, entendo como uma solução de contorno apenas, até onde eu vejo e sei o Thread.sleep não é uma boa prática...

Mas valeu Matheus!

solução!

Na própria documentação do android eles fazem isso :(

Concordo contigo sobre o fator de não ser legal e tals, mas é o jeito que temos de fazer, mas pense que esse tipo de teste é o que você menos vai fazer no dia a dia, ele é muito custoso