How to go about checking whether RecyclerView items are displayed in the correct order using Espresso? I'm trying to test it checking it by the text for the title of each element.
When I try this piece of code it works to click the element but can't go on to instead of performing a click trying to Assert the text for the element
onView(withId(R.id.rv_metrics)).perform(actionOnItemAtPosition(0, click()));
When I try to use a custom matcher instead I keep getting the error
Error performing 'load adapter data' on view 'with id: mypackage_name:id/rv_metrics'
I know now onData doesn't work for RecyclerView
but before that I was trying to use a custom matcher for this task.
public static Matcher<Object> hasTitle(final String inputString) {
return new BoundedMatcher<Object, Metric>(Metric.class) {
@Override
protected boolean matchesSafely(Metric metric) {
return inputString.equals(metric.getMetric());
}
@Override
public void describeTo(org.hamcrest.Description description) {
description.appendText("with title: ");
}
};
}
I also tried something like this but it obviously doesn't work due to the type given as parameter to the actionOnItemAtPosition method but would we have something similar to it that could maybe work?
onView(withId(R.id.rv_metrics)).check(actionOnItemAtPosition(0, ViewAssertions.matches(withText("Weight"))));
What am I missing here please? Thanks a lot.
As it's been mentioned here,
RecyclerView
objects work differently thanAdapterView
objects, soonData()
cannot be used to interact with them.In order to find a view at specific position of a
RecyclerView
you need to implement a customRecyclerViewMatcher
like below:And then use it in your test case in this way:
I simplified a bit Mosius answer:
We pass
Matcher
to the function so we can provide further conditions. Example usage:If you want to match a matcher on a position in
RecyclerView
, then you can try to create a customMatcher<View>
:And you can use it for example:
The original problem has been solved but am posting an answer here as found the Barista library solves this problem in one single line of code.
It's made on top of Espresso and the documentation for it can be found here
Hope this may be helpful to someone. :)