#java #android #kotlin #junit #android-espresso
#Ява #Android #котлин #джунит #android-эспрессо
Вопрос:
Недавно я решил обновить свой код Эспрессо, чтобы использовать ActivityScenarioRule
его вместо устаревшего ActivityTestRule
.
Для этого я импортировал в свой проект следующую библиотеку:
Окончательный код с использованием ActivityScenarioRule
:
package com.realtomjoney.pyxlmoose.activities.main import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions import androidx.test.espresso.matcher.ViewMatchers.* import com.realtomjoney.pyxlmoose.R import org.junit.Rule import org.junit.Test import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.assertion.ViewAssertions import androidx.test.ext.junit.rules.ActivityScenarioRule import androidx.test.filters.LargeTest import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner import org.junit.runner.RunWith @LargeTest @RunWith(AndroidJUnit4ClassRunner::class) class MainActivityTestsWhenNewProjectIsCreated { @get:Rule var activityTestRule = ActivityScenarioRule(MainActivity::class.java) private fun createNewProject() { onView(withId(R.id.floatingActionButton)).perform(click()) onView(withId(R.id.fragmentNewCanvas_projectTitleTextInputEditText)).perform(ViewActions.replaceText("Untitled Project")) onView(withId(R.id.fragmentNewCanvas_spanCountTextInputEditText)).perform(ViewActions.replaceText("5")) onView(withId(R.id.fragmentNewCanvas_doneButton)).perform(click()) } @Test fun uitest_fragmentNewCanvasProjectTitleTextInputEditText_isNotDisplayed_after_fragmentNewCanvasDoneButton_isPressed() { createNewProject() onView(withId(R.id.fragmentNewCanvas_projectTitleTextInputEditText)).check(ViewAssertions.doesNotExist()) } @Test fun uitest_fragmentNewCanvasProjectTitleTextInputLayout_isNotDisplayed_after_fragmentNewCanvasDoneButton_isPressed() { createNewProject() onView(withId(R.id.fragmentNewCanvas_projectTitleTextInputLayout)).check(ViewAssertions.doesNotExist()) } @Test fun uitest_fragmentNewCanvasSpanCountTextInputEditText_isNotDisplayed_after_fragmentNewCanvasDoneButton_isPressed() { createNewProject() onView(withId(R.id.fragmentNewCanvas_spanCountTextInputEditText)).check(ViewAssertions.doesNotExist()) } @Test fun uitest_fragmentNewCanvasSpanCountTextInputLayout_isNotDisplayed_after_fragmentNewCanvasDoneButton_isPressed() { createNewProject() onView(withId(R.id.fragmentNewCanvas_spanCountTextInputLayout)).check(ViewAssertions.doesNotExist()) } @Test fun uitest_fragmentNewCanvasDoneButton_isNotDisplayed_after_fragmentNewCanvasDoneButton_isPressed() { createNewProject() onView(withId(R.id.fragmentNewCanvas_doneButton)).check(ViewAssertions.doesNotExist()) } }
Всякий раз, когда я запускаю тесты пользовательского интерфейса, я получаю следующую ошибку:
Unresolved reference: ext
Ошибка исходит из этой строки:
import androidx.test.ext.junit.rules.ActivityScenarioRule
build.gradle
:
plugins { id 'com.android.application' id 'kotlin-android' } android { compileSdk 31 testOptions { unitTests.includeAndroidResources = true } defaultConfig { applicationId "com.realtomjoney.pyxlmoose" minSdk 27 targetSdk 31 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } buildFeatures { viewBinding true } testOptions { unitTests.returnDefaultValues = true } } dependencies { implementation 'androidx.core:core-ktx:1.7.0' implementation 'androidx.appcompat:appcompat:1.4.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.2' // implementation 'androidx.test:core-ktx:1.4.0' implementation 'com.google.android.material:material:1.5.0-beta01' testImplementation 'junit:junit:4.13.2' testImplementation 'androidx.test:core-ktx:1.4.0' testImplementation 'androidx.test.ext:junit-ktx:1.1.3' testImplementation 'org.robolectric:robolectric:4.4' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0-alpha03' androidTestImplementation 'androidx.test:rules:1.4.1-alpha03' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-contrib:3.0.2' }
У кого-нибудь есть идеи, как это исправить? Это заявление об импорте было добавлено автоматически Android Studio, и я не понимаю, почему в нем говорится, что » ext » является неразрешенной ссылкой. Любая помощь будет очень признательна.
Дело не в том, что код с ActivityTestRule
не работает, я просто хотел переключиться на более безопасную альтернативу, которая, похоже, такова ActivityScenarioRule
— если я продолжу сталкиваться с этими проблемами, мне, возможно, придется вернуться к устаревшей библиотеке.
Если я могу каким-либо образом улучшить этот вопрос, пожалуйста, дайте мне знать в комментариях.
Комментарии:
1. Как выглядит ваш
build.gradle
файл?2. @dominicoder Я отредактировал свой вопрос, чтобы включить этот файл.
Ответ №1:
Э-э, подождите секунду, у меня уже есть реализация «androidx.test:core-ktx:1.4.0», включенная в мой проект… Закомментированный вариант-это просто дубликат lol
Вы импортировали его так, как testImplementation
и должно быть androidTestImplementation
.
Способ объявления зависимости зависит от того, какие тесты будут ее использовать. testImplementation
предназначен для чего угодно test/
(обычно модульные тесты, которые не зависят от платформы Android). Все, что зависит от платформы Android, выходит из строя androidTest/
и поэтому будет использоваться androidTestImplementation
:
androidTestImplementation 'androidx.test.ext:junit-ktx:1.1.3'