Не удается получить контекст в сопоставителе Hamcrest

#android #android-espresso #hamcrest

#Android #android-эспрессо #хэмкрест #hamcrest

Вопрос:

Вот мой тест на эспрессо:

  @Test
    fun buttonStartBackgroundColor() {
        onView(withId(R.id.startButton)).check(matches(withBackgroundColorResId(R.color.colorAccent)));
    }
  

Вот мой пользовательский сопоставитель Hamcrest:

 import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
import androidx.test.espresso.matcher.BoundedMatcher
import androidx.test.espresso.matcher.ViewMatchers.isAssignableFrom
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat

object CustomMatchers {
    private val TAG = CustomMatchers::class.java.name

    fun withBackgroundColorResId(expectedId: Int): Matcher<View> {

            return object : BoundedMatcher<View, ViewGroup>(ViewGroup::class.java) {
                override fun matchesSafely(view: ViewGroup): Boolean {
                    val color = (view.background.current as ColorDrawable).color
                    return color == ContextCompat.getColor(view.context, expectedId)
                }

                override fun describeTo(description: Description) {
                    description.appendText("with background color: ")
                    description.appendValue(expectedId)
                }
            }
        }
}
  

Тест завершается неудачей с сообщением:

 androidx.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: 'with background color: <2131034155>' doesn't match the selected view.
Expected: with background color: <2131034155>
  

Но это сообщение не читается человеком.
Итак, я хочу переписать метод describeTo , чтобы получить читаемый человеком текст. Что-то вроде этого:

 override fun describeTo(description: Description) {
                description.appendText("with background color: ")
                description.appendValue(ContextCompat.getColor(getResources(), expectedId))
            }
  

но я получаю ошибку компиляции, потому что не могу разрешить getResources() . Мне нужен контекст Android, чтобы исправить это.

Как я могу получить контекст в методе describeTo

Ответ №1:

Вы должны использовать следующие методы, чтобы получить необходимый вам контекст:

 InstrumentationRegistry.getInstrumentation().context // for test application context
InstrumentationRegistry.getInstrumentation().targetContext // for application under test context
  

Смотрите пример здесь.