Нет подходящих представлений в иерархии: JetPack Compose

Я пытаюсь запустить тест, используя эспрессо в композиции реактивного ранца. Каждый раз, когда я запускаю его, он дает эту ошибку.

androidx.test.espresso.NoMatchingViewException: в иерархии не найдено совпадений: экземпляр android.widget.TextView и view.getText() с преобразованием или без него: "Count"

Мой MainActivity.kt

package com.example.testing

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.material.Button
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.example.testing.ui.theme.TestingTheme

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            TestingTheme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colors.background
                ) {
                    Greeting()
                }
            }
        }
    }
}

@Composable
fun Greeting() {
    var counter by remember{
        mutableStateOf(0)
    }
    Column(
        modifier = Modifier
            .fillMaxSize()
            .wrapContentSize(Alignment.Center)
    ) {
        Text(text = stringResource(id = R.string.Count),
            modifier = Modifier
                .padding(8.dp)
                .testTag(stringResource(id =  R.string.)))

        Button(onClick = { counter++ }) {
            Text(text = stringResource(id = R.string.Increment))
        }
    }
}

@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
    TestingTheme {
        Greeting()
    }
}

Мой тест.кт

package com.example.testing


import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import com.microsoft.appcenter.espresso.ReportHelper;
import androidx.lifecycle.Lifecycle
import androidx.test.core.app.ActivityScenario
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.*
import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import com.microsoft.appcenter.espresso.Factory
import org.junit.After

import org.junit.Test
import org.junit.runner.RunWith

import org.junit.Assert.*
import org.junit.Before
import org.junit.Rule

/**
 * Instrumented test, which will execute on an Android device.
 *
 * See [testing documentation](http://d.android.com/tools/testing).
 */
@RunWith(AndroidJUnit4::class)
@LargeTest
class ExampleInstrumentedTest {

    @Rule
    val activityRule = ActivityScenarioRule(MainActivity::class.java)  //espresso

    @Test
    fun testClick() {
        onView(withText("Count")).check(matches(isDisplayed()))
    } 
}

У меня есть Count в string.xml как Count. У меня эмулятор работает нормально. Похоже, он не может обнаружить активность.

В @Test, если я пропущу

.check(matches(isDisplayed()))

часть от

onView(withText("Count")).check(matches(isDisplayed()))

это проходит.

Также я пробовал junit4

val composeTestRule = createAndroidComposeRule<MainActivity>()

И это работает, но эспрессо не работает

Пожалуйста, обрежьте свой код, чтобы было легче найти вашу проблему. Следуйте этим рекомендациям, чтобы создать минимально воспроизводимый пример.

Community 18.11.2022 13:54
1
1
120
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать:

@get:Rule
val composeRule = createComposeRule()

@Test
fun testClick() {
    composeRule.setContent {
        TestingTheme {
            Greeting()
        }
    }
    composeRule.onNodeWithText("Count").assertIsDisplayed()
}

В качестве альтернативы вы также можете использовать:

@OptIn(ExperimentalFoundationApi::class, ExperimentalComposeUiApi::class)
@get:Rule
val composeTestRule = createAndroidComposeRule<MainActivity>()

@OptIn(ExperimentalFoundationApi::class, ExperimentalComposeUiApi::class)
@Test
fun testClick() {
    composeTestRule.onNodeWithText("Count").assertIsDisplayed()
}

Привет, это работает, но на самом деле я искал тестирование с эспрессо. У меня есть приложение, которое я хочу протестировать в appcenter ms. И Эспрессо, похоже, не работает в составе реактивного ранца.

Deeshant Kotnala 21.11.2022 12:33

@DeeshantKotnala developer.android.com/jetpack/compose/testing#espresso-inter‌​op

Gabriele Mariotti 21.11.2022 12:47

Вы уверены, что это сработает в джетпаке? Потому что тест, который я написал выше, такой же, как и там.

Deeshant Kotnala 21.11.2022 13:00

@DeeshantKotnala Нет, все наоборот. Не используйте Espresso для тестов Compose.

Gabriele Mariotti 21.11.2022 15:00

Другие вопросы по теме