Android Espresso - assert text on screen against string in resources

klimos picture klimos · Sep 12, 2016 · Viewed 16k times · Source

I have the following text in strings.xml resources file:

<string name="txt_to_assert">My Text</string>

Normally in a application code, to use this text and display it on screen, I'm doing the following:

getString(R.string.main_ent_mil_new_mileage);

At the moment, I'm trying to use this string resource in a UI test written with Espresso. I'm thinking of doing something like that:

String myTextFromResources = getString(R.string.main_ent_mil_new_mileage);
onView(allOf(withId(R.id.my_text_on_screen), withText(myTextFromResources))
    .check(matches(isDisplayed()));

However, getString(...) method cannot be used here.
Is there a way to get a text from strings.xml resource file and use it in a test written with Espresso?

Answer

adalpari picture adalpari · Sep 12, 2016

Use this function:

private String getResourceString(int id) {
    Context targetContext = InstrumentationRegistry.getTargetContext();
    return targetContext.getResources().getString(id);
}

You just have to call it with the id of the string and perform your action:

String myTextFromResources = getResourceString(R.string.main_ent_mil_new_mileage);
onView(allOf(withId(R.id.my_text_on_screen), withText(myTextFromResources))
    .check(matches(isDisplayed()));

*EDIT for new Espresso version:

With new version of Espresso, you should be able to call directly the string resource with a ViewMatcher. So first, I recommend to try directly this import

import static android.support.test.espresso.matcher.ViewMatchers.withText;

And then in the code:

withText(R.string.my_string_resource)