Создание Espresso Matcher для класса с дженериками - PullRequest
1 голос
/ 21 мая 2019

Я пытаюсь создать новый Matcher для эспрессо, чтобы иметь возможность выбрать элемент списка.Это отлично работает для простого класса, такого как Office.См. Этот пример.

  private fun withOffice(title: String): Matcher<Any> {
    return object : BoundedMatcher<Any, Office>(Office::class.java) {
        override fun describeTo(description: Description?) {
            description?.appendText("with title '$title'");
        }

        public override fun matchesSafely(office: Office): Boolean {
            return office.name == title
        }
    }
}

Однако при вводе дженериков все становится сложнее, как в этом классе.

class KeyTranslationPair<F, S> extends Pair<F, S>

Попытка создать Matcher, подобный этому

  private fun withCompanyType(companyType: CompanyType): Matcher<Any> {
    return object : BoundedMatcher<Any, KeyTranslationPair<CompanyType, String>>(KeyTranslationPair<CompanyType, String>::class.java) {
        override fun describeTo(description: Description?) {
            description?.appendText("with companyType '$companyType'");
        }

        public override fun matchesSafely(keyTranslationPair: KeyTranslationPair<CompanyType, String>): Boolean {
            return keyTranslationPair.key == companyType
        }
    }
}

приводит к следующей ошибке

enter image description here

Я предполагаю, что kotlin смешивает вещи с системой типов Java.Может быть, у кого-то есть идея здесь.

1 Ответ

1 голос
/ 23 мая 2019

Это потому, что KeyTranslationPair<CompanyType,Strnig> не класс, когда говорят, что класс означает KeyTranslationPair::class.java, поэтому вы можете сделать это следующим образом:

return object : BoundedMatcher<Any, KeyTranslationPair<*,*>>(KeyTranslationPair::class.java)

И вы говорите, что не знаете, чтовнутри KeyTranslationPair, и, поскольку это Generic, вам придется изменить matchesSafely на:

override fun matchesSafely(item: KeyTranslationPair<*, *>?): Boolean {
   return item?.key == companyType
}

А также вы можете проверить, является ли Key экземпляром CompanyType делать:

override fun matchesSafely(item: KeyTranslationPair<*, *>?): Boolean {
    if(item?.key is CompanyType){
        return item.key == companyType
    }
        return false
    }

Надеюсь, это поможет.

...