浓咖啡检查是否未显示对话框

Mat*_*hew 5 android automated-tests dialog android-espresso

我有一种方法可以检查几个条件,并在满足条件时调用另一个活动。当不满足条件时,它将显示一个错误对话框(当前正在使用DialogFragment显示警报对话框)。该方法如下所示:

void checkAndCall() {
    CustomObject o1 = null;
    try {
        o1 = CustomObject.parse(editText1.getText().toString());
    } catch (CustomException e) {
        handleBadCase(e);
        return;
    }

    CustomObject o2 = null;
    try {
        o2 = CustomObject.parse(editText2.getText().toString());
    } catch (CustomException e) {
        handleBadCase(e);
        return;
    }

    callOtherActivity();
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我忘记了一个return语句,这导致该方法下降到下一个检查(失败)并显示两个错误对话框。我想确保不会再发生这种情况,因此为此编写了一个测试。

我的测试看起来像这样:

public class TestClass {

    @Rule
    public ActivityTestRule<MyActivity> mActivityRule = new ActivityTestRule<>(MyActivity.class);

    @Test
    public void onlyOneDialogAppearsWithEmptySolve() {
        /* Hit solve with no text entered */
        onView(withId(R.id.solve_button)).perform(click());

        /* Check that dialog is displayed */
        onView(isRoot()).inRoot(isDialog()).check(matches(isDisplayed()));

        /* Press cancel */
        onView(withText(getString(R.string.cancel))).perform(click());

        /* No dialog is displayed */
        onView(isRoot()).inRoot(isDialog()).check(doesNotExist());      
    }
} 
Run Code Online (Sandbox Code Playgroud)

我以为那onView(isRoot()).inRoot(isDialog())会匹配任何对话框的根视图。但是,如果不匹配,这似乎只是挂起。因此,当应该满足测试要求时(只有一个对话框出现并被取消),它会挂起。如果我们注释掉该行,并且不显示任何对话框,则测试将挂起“ 检查对话框是否显示”行。

我希望不要与对话框文本匹配,因为它们可能都不同。我仍然需要确保只有一种情况发生。现在,我利用了所有人都拥有的“取消”按钮来进行匹配。但是,我宁愿不依赖于此。

有没有说出来的对话框的显示方法?和是否不显示对话框? 为什么我的支票导致挂起?

Oli*_*etz 0

由于这是条件/导航逻辑,我会将其放入 ViewModel 中并在单元测试中对其进行测试。使用模拟框架(例如mockito),您可以验证某些方法仅被调用一次。不完全是您问题的答案,但应该可以帮助您避免一些不需要的调用错误。