意式浓缩咖啡动态旋转器测试

espresso dynamic spinner testing

我正在尝试测试动态生成的 Spinner。我可以单击微调器,但随后我需要 select 列表中的一个选项,其中显示了给定的文本(我从 hierarchyviewer 中发现显示了 PopupWindow 但无法获取所需的文本这是屏幕外的)。微调器使用自定义对象的 ArrayAdapter(下面的代码),

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Spinner mySpinner = (Spinner) findViewById(R.id.my_spinner);
        List<MyValue> list = Arrays.asList(
                new MyValue("One", "1"),
                new MyValue("Two", "2"),
                new MyValue("Three", "3"),
                new MyValue("Four", "4"),
                new MyValue("Five", "5"),
                new MyValue("Six", "6"),
                new MyValue("Seven", "7"),
                new MyValue("Eight", "8"),
                new MyValue("Nine", "9"),
                new MyValue("Ten", "10"),
                new MyValue("Eleven", "11"),
                new MyValue("Twelve", "12"),
                new MyValue("Thirteen", "13"),
                new MyValue("Fourteen", "14"),
                new MyValue("Fifteen", "15"),
                new MyValue("Sixteen", "16"),
                new MyValue("Seventeen", "17"),
                new MyValue("Eighteen", "18"),
                new MyValue("Nineteen", "19"),
                new MyValue("Twenty", "20"),
                new MyValue("Twenty One", "21")
        );

        final ArrayAdapter<MyValue> adapter = new ArrayAdapter<>(this,
                R.layout.dropdown_selected_item,
                list);
        mySpinner.setAdapter(adapter);
        mySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                Log.d("MySpinnerTest", "current = " + adapter.getItem(position));
            }
            @Override
            public void onNothingSelected(AdapterView<?> parent) {}
        });
    }

    public class MyValue {
        String name;
        String code;

        public MyValue(String name, String code) {
            this.name = name;
            this.code = code;
        }

        @Override
        public String toString() {
            return name;
        }
    }
}

我尝试使用 onData(withSpinnerText("Twenty")).perform(click()) 但得到一个 PerformException,我试图找出如何根据给定的文本在微调器弹出窗口中匹配正确的视图,但无法弄清楚如何做到这一点。

如有任何帮助,我们将不胜感激。

TIA

mySpinner.setAdapter(adapter);

之前,您的 Spinner 似乎没有下拉视图

请添加这一行:

adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

找到了一种方法,所以发布了我自己的问题的答案。

我必须为我的对象创建一个自定义匹配器,然后将其与 onData()

一起使用
public static Matcher<Object> withMyValue(final String expectedName) {
    return new BoundedMatcher<Object, MyValue>(MyValue.class) {

        @Override
        public void describeTo(Description description) {
            description.appendText("with expectedName: " + expectedName);
        }

        @Override
        protected boolean matchesSafely(MyValue myValue) {
            return myValue.getName().equalsIgnoreCase(expectedName);
        }
    };
}

然后可以用作(点击微调器显示下拉列表后)

onData(withMyValue(field.name)).perform(click());