Тест Android Espresso: незаконный доступ к классу: ‘androidx.test.core.app.ListFuture’ пытается получить доступ к ‘androidx.concurrent.futures.DirectExecutor’

#java #android #kotlin #junit #android-espresso

#java #Android #kotlin #junit #android-espresso

Вопрос:

У меня есть следующий тестовый файл пользовательского интерфейса и файл расширений для приложения, которое я создаю:

 package com.realtomjoney.pyxlmoose.activities.`2_canvas`

import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.*
import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.filters.LargeTest
import com.realtomjoney.pyxlmoose.R
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner
import com.realtomjoney.pyxlmoose.AndroidTestUtilityFunctions
import com.realtomjoney.pyxlmoose.activities.canvas.CanvasActivity

@LargeTest
@RunWith(AndroidJUnit4ClassRunner::class)
class CanvasActivityTestsOnFindAndReplaceButtonTap {
    @get:Rule
    var activityTestRule = ActivityScenarioRule(CanvasActivity::class.java)

    @Test fun uitest_doneButton_isNotDisplayed_after_findAndReplaceButton_isPressed() {
        AndroidTestUtilityFunctions.goToFindAndReplaceFragment()
        onView(withId(R.id.activityCanvas_doneButton)).check(matches(withEffectiveVisibility(Visibility.GONE)))
    }

    @Test fun uitest_colorPickerRecyclerView_isNotDisplayed_after_findAndReplaceButton_isPressed() {
        AndroidTestUtilityFunctions.goToFindAndReplaceFragment()
        onView(withId(R.id.activityCanvas_colorPickerRecyclerView)).check(matches(withEffectiveVisibility(Visibility.GONE)))
    }

    @Test fun uitest_titleTextView_isNotDisplayed_after_findAndReplaceButton_isPressed() {
        AndroidTestUtilityFunctions.goToFindAndReplaceFragment()
        onView(withId(R.id.activityCanvas_canvasTitleEditText)).check(matches(withEffectiveVisibility(Visibility.GONE)))
    }

    @Test fun uitest_colorSwapButton_isNotDisplayed_after_findAndReplaceButton_isPressed() {
        AndroidTestUtilityFunctions.goToFindAndReplaceFragment()
        onView(withId(R.id.activityCanvas_colorSwapButton)).check(matches(withEffectiveVisibility(Visibility.GONE)))
    }

    @Test fun uitest_colorPrimarySelected_isNotDisplayed_after_findAndReplaceButton_isPressed() {
        AndroidTestUtilityFunctions.goToFindAndReplaceFragment()
        onView(withId(R.id.activityCanvas_colorPrimaryView)).check(matches(withEffectiveVisibility(Visibility.GONE)))
    }

    @Test fun uitest_colorSecondarySelected_isNotDisplayed_after_findAndReplaceButton_isPressed() {
        AndroidTestUtilityFunctions.goToFindAndReplaceFragment()
        onView(withId(R.id.activityCanvas_colorSecondaryView)).check(matches(withEffectiveVisibility(Visibility.GONE)))
    }
}
 
 object AndroidTestUtilityFunctions {
    private const val defaultProjectName = "Unnamed Project"
    private const val defaultProjectSpanCount = 5

    fun goToFindAndReplaceFragment() {
        onView(withId(R.id.activityCanvas_canvasToolsScrollView)).perform(swipeLeft())
        onView(withId(R.id.activityCanvas_findAndReplaceButton)).perform(click())
    }

    fun createNewProject(projectName: String = defaultProjectName, spanCount: Int = defaultProjectSpanCount) {
        onView(withId(R.id.activityMain_newProjectButton)).perform(click())
        onView(withId(R.id.fragmentNewCanvas_projectTitleTextInputEditText)).perform(replaceText(projectName))
        onView(withId(R.id.fragmentNewCanvas_spanCountTextInputEditText)).perform(replaceText(spanCount.toString()))
        onView(withId(R.id.fragmentNewCanvas_doneButton)).perform(click())
    }
}
 

По какой-то причине, когда я запускаю тесты пользовательского интерфейса, я получаю следующее раздражающее исключение:

 java.lang.IllegalAccessError: Illegal class access: 'androidx.test.core.app.ListFuture' attempting to access 'androidx.concurrent.futures.DirectExecutor' (declaration of 'androidx.test.core.app.ListFuture' appears in /data/app/~~xOjrSE9BCeINue7sOBFVJw==/com.realtomjoney.pyxlmoose.test-VqvV0FRJD_fIuyk2Jiuyyw==/base.apk)
    at androidx.test.core.app.ListFuture.directExecutor(ListFuture.java:139)
    at androidx.test.core.app.ListFuture.init(ListFuture.java:101)
    at androidx.test.core.app.ListFuture.<init>(ListFuture.java:84)
    at androidx.test.core.app.DeviceCapture$forceRedrawGlobalWindowViews$1.run(DeviceCapture.kt:151)
    at android.os.Handler.handleCallback(Handler.java:938)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loopOnce(Looper.java:201)
    at android.os.Looper.loop(Looper.java:288)
    at android.app.ActivityThread.main(ActivityThread.java:7842)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
 

Я понятия не имею, почему это происходит, я пару недель пытался решить эту проблему, но безуспешно — я все еще получаю одно и то же исключение всякий раз, когда пытаюсь выполнить свои тесты пользовательского интерфейса. Это очень плохо, поскольку я на самом деле регулярно совершаю ошибочный код! Мне действительно нужно исправить эту проблему.

Ответ №1:

У меня тоже была такая же проблема. Я потратил кучу времени на его изучение и в конечном итоге обнаружил, что ваша проблема связана с этим: https://issuetracker.google.com/issues/204506297

По сути, эта версия библиотеки Espresso пытается использовать перечисление из другой библиотеки, к которой у нее нет доступа к области видимости. Они исправили проблему здесь: https://github.com/android/android-test/pull/1174

К сожалению, на момент написания 3.5.0-alpha03 статьи это последняя версия. Итак, вы можете либо подождать, пока alpha04 / beta01 или понизить рейтинг до 3.4.0 , пока проблема не будет устранена.