Android Studio 3.2.
У меня есть активность TradesActivity
, которая показывает список предметов (Trader
).Этот список показывает RecyclerView
.
Мне нужно написать следующий тест эспрессо.если trader.getRunning() == true
, то цвет фона элемента красный .Еще цвет фона зеленый .Я нахожу трейдера по позиции.
Так что мой тест эспрессо должен пройти следующие шаги:
- Получить трейдера определенной позиции (например, 6)
- Чек
trader.running
- если это правда, тогда проверьте фон textView
Как я могу сделать это с помощью Espresso?
Вот мое решение.Это хорошее решение?
@Rule
@JvmField
var activityActivityTestRule = ActivityTestRule(TradersActivity::class.java)
@Test
fun itemList_itemContainerBackgrounColor() {
// scroll to position
onView(withId(R.id.tradersRecyclerView))
.perform(RecyclerViewActions.actionOnItemAtPosition<RecyclerView.ViewHolder>(CHECK_ITEM_LIST_POS, swipeLeft()))
// check
onView(withId(R.id.tradersRecyclerView)).check(hasCorrectBackgroundColorAtPosition(CHECK_ITEM_LIST_POS, R.id.itemContainer))
}
фрагмент моего пользовательского ViewAssertion:
class TraderViewAssertion {
companion object {
fun hasCorrectBackgroundColorAtPosition(position: Int, @IdRes resId: Int): ViewAssertion {
return object : ViewAssertion {
override fun check(view: View, exception: NoMatchingViewException) {
if (view !is RecyclerView) {
throw exception
}
val trader = (view.adapter as TraderListItemAdapter).getItem(position) as Trader
val itemView = view.findViewHolderForAdapterPosition(position)!!.itemView.findViewById<View>(resId) as TextView
val itemViewColorDrawable = itemView.getBackground() as ColorDrawable
val colorCode = itemViewColorDrawable.color
if (trader.isRunning) {
if (DateUtil.getDiffMinutes(Date(trader.last_iteration_time), Date()) > 1) {
Assert.assertTrue("Wrong color at position $position", (colorCode == R.color.trade_error_color))
} else {
Assert.assertTrue("Wrong color at position $position", (colorCode == R.color.trade_running_color))
}
} else {
Assert.assertTrue("Wrong color at position $position", (colorCode == R.color.trade_not_running_color))
}
}
}
}
}
}
Но я получаю ошибку:
java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter exception
at com.myproject.custom.assertion.TraderViewAssertion$Companion$hasCorrectBackgroundColorAtPosition$1.check(TraderViewAssertion.kt)
at androidx.test.espresso.ViewInteraction$SingleExecutionViewAssertion.check(ViewInteraction.java:419)
at androidx.test.espresso.ViewInteraction$2.call(ViewInteraction.java:282)
at androidx.test.espresso.ViewInteraction$2.call(ViewInteraction.java:268)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)