Как проверить настройки предпочтений в Robolectri c? - PullRequest
0 голосов
/ 28 января 2020

Я хочу проверить изменения электронной почты в моем приложении Android. Я использую Robolectri c 4.3.1.

У меня есть класс, который загружает фрагмент с настройками.

public class ApplicationPreferencesActivity extends AppCompatActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_container);
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.container, new SettingsFragment())
                .commit();
    }

}

frag_container:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    tools:context=".zeus.ApplicationPreferencesActivity">

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </FrameLayout>

</LinearLayout>

В SettingsFragment я загружаю EditTextPreference с электронной почтой.

public class SettingsFragment extends PreferenceFragmentCompat {

    private String TAG = "kb_settings";

    private EditTextPreference locationIntervalPreference;
    private EditTextPreference buildingRadiusPreference;

    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        setPreferencesFromResource(R.xml.prefs, rootKey);

        EditTextPreference emailPreference = findPreference("email");
        // next onClick and onChange listeners
    }
}

prefs:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/preferences_screen">

    <PreferenceCategory
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:summary="@string/preferences_summary"
        android:title="@string/preferences_button"
        android:id="@+id/preferences_category">

        <EditTextPreference
            android:key="email"
            android:summary="@string/preferences_email_summary"
            android:title="@string/preferences_email_title" />

    </PreferenceCategory>

</PreferenceScreen>

Я добавил класс, чтобы проверить, отображается ли предпочтение.

@RunWith(RobolectricTestRunner.class)
public class ChangeEmailTest {

    private Context context;

    @Rule
    public ActivityTestRule<ApplicationPreferencesActivity> settingsRule =
            new ActivityTestRule<>(ApplicationPreferencesActivity.class, true, false);

    @Before
    public void initEnvironment() {
        //...

        settingsRule.launchActivity(new Intent(ApplicationProvider.getApplicationContext(), ApplicationPreferencesActivity.class));
    }

    @Test
    public void testChangeEmail() {
        onData(allOf(
                is(instanceOf(Preference.class)),
                withKey("email"),
                withSummary(R.string.preferences_email_summary),
                withTitle(R.string.preferences_email_title)))
                .check(matches(isCompletelyDisplayed()))
    }

}

Приведенный выше код генерирует ниже исключения.

androidx.test.espresso.NoMatchingViewException: No views in hierarchy found matching: is assignable from class: class android.widget.AdapterView
at java.lang.Thread.getStackTrace(Thread.java:1559)
    at androidx.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:96)
    at androidx.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:59)
    at androidx.test.espresso.ViewInteraction.waitForAndHandleInteractionResults(ViewInteraction.java:322)
    at androidx.test.espresso.ViewInteraction.desugaredPerform(ViewInteraction.java:178)
    at androidx.test.espresso.ViewInteraction.perform(ViewInteraction.java:119)
    at androidx.test.espresso.DataInteraction$DisplayDataMatcher$1.apply(DataInteraction.java:213)
    at androidx.test.espresso.DataInteraction$DisplayDataMatcher$1.apply(DataInteraction.java:210)
    at androidx.test.espresso.DataInteraction$DisplayDataMatcher.<init>(DataInteraction.java:230)
    at androidx.test.espresso.DataInteraction$DisplayDataMatcher.<init>(DataInteraction.java:205)
    at androidx.test.espresso.DataInteraction$DisplayDataMatcher.displayDataMatcher(DataInteraction.java:248)
    at androidx.test.espresso.DataInteraction.makeTargetMatcher(DataInteraction.java:150)
    at androidx.test.espresso.DataInteraction.perform(DataInteraction.java:135)
    at com.netteam.zeus.ChangeEmailTest.testChangeEmail(ChangeEmailTest.java:113)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:531)
    at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
    at org.robolectric.RobolectricTestRunner$HelperTestRunner$1.evaluate(RobolectricTestRunner.java:546)
    at org.robolectric.internal.SandboxTestRunner$2.lambda$evaluate$0(SandboxTestRunner.java:252)
    at org.robolectric.internal.bytecode.Sandbox.lambda$runOnMainThread$0(Sandbox.java:89)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

Я пытался разрешить это исключение с помощью this и this . Я перепробовал все приведенные ниже случаи, и все не удалось.

onData(PreferenceMatchers.withKey(context.getString(R.string.email)))
       .check(matches(isDisplayed()));

onData(allOf(is(instanceOf(Preference.class)), withTitle(R.string.email)))
        .check(matches(isDisplayed()));

onData(anything())
        .inAdapterView(allOf(
                 isDescendantOfA(withId(R.id.container)),
                 withId(R.id.preferences_category)))
        .atPosition(1)
        .check(matches(isDisplayed()));

onData(allOf(is(instanceOf(Preference.class)), withKey("email")))
        .onChildView(withText(R.string.preferences_email_title))
        .check(matches(isDisplayed()));

onData(anything())
        .atPosition(1)
        .onChildView(withText(R.string.preferences_email_title))
        .check(matches(isDisplayed()));

onData(allOf(is(instanceOf(Preference.class)), withTitle(R.string.preferences_email_title)))
        .check(matches(isDisplayed()));

onData(allOf(is(instanceOf(Preference.class)), withKey("email")))
        .check(matches(isDisplayed()));

onData(PreferenceMatchers.withKey("email"))
        .check(matches(isDisplayed()));

Как решить эту проблему?

...