Неразрешенная ссылка: ext при импорте androidx.test.ext.junit.правила.деятельностисценариорул

#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'