在Espresso中使用ArrayAdapter和Material v7支持库选择对话框选项

时间:2015-12-11 12:38:14

标签: android testing android-dialog android-espresso

我有一个带有元素列表的对话框,其中每个元素都提供了一个ArrayAdapter:

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState){

        ArrayList<String> names = getArguments().getStringArrayList(INTENT_OPTIONS);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                getActivity(), android.R.layout.simple_list_item_1, names);
        DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener(){
            @Override
            public void onClick(DialogInterface dialog, int which){
                if (mListener != null){
                    mListener.onSelectedElement(which);
                }
            }
        };

        return new AlertDialog.Builder(getActivity())
                .setTitle(R.string.loginActivity_selectVACenter)
                .setCancelable(true)
                .setAdapter(adapter, listener)
                .create();
    }

在实施appcompat v7库以合并材质特征之前,我使用以下句子选择了Espresso中的每个元素:

onView(withText("text of the entry"))
                    .perform(click());

但是在添加这个库之后,这个句子不再起作用了,Espresso无法找到视图并抛出NoMatchingViewException。

有没有其他方法可以访问对话框选项?

1 个答案:

答案 0 :(得分:1)

我已经找到了这个可能有用的主题:Check if a dialog is displayed with Espresso

在一个可能的答案中,有一个getRootView()匹配器:

  

为了回答问题4,接受的答案没有,我修改了   下面的代码,我在Stack Overflow上找到了这个代码   (link)进行测试   是否显示了Toast。

@NonNull
public static ViewInteraction getRootView(@NonNull Activity activity, @IdRes int id) {
    return onView(withId(id)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView()))));
}
     

传入的id是您当前显示的View的ID   对话。您也可以这样编写方法:

@NonNull
public static ViewInteraction getRootView(@NonNull Activity activity, @NonNull String text) {
    return onView(withText(text)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView()))));
}
     

现在它正在寻找包含特定文本字符串的View

     

像这样使用它:

getRootView(getActivity(), R.id.text_id).perform(click());

首先尝试这个。同样在同一主题中你会发现这个方法:

  。

onView(withText(R.string.my_title))器InRoot(isDialog())检查(匹配(isDisplayed()));

如果仍然无效,可能会使用onData匹配器。

  

每当你有一个ListView,GridView,Spinner和其他适配器   基于视图,你必须使用onData()才能与a进行交互   该列表中的项目。 onData()直接针对提供的数据   通过适配器。这意味着什么,我们马上就会看到。[1]

你可以在这里阅读:

Get started with a simple test using onData

[codepath] UI Testing with Espresso

Android Espresso onData with doesNotExist