8

Próbuję przetestować dynamicznie generowane Spinner. Mogę kliknąć spinner, ale muszę wybrać opcję z listy z wyświetlonym danym tekstem (dowiedziałem się z przeglądarki hierarchicznej, że jest wyświetlane okno PopupWindow, ale nie mogę dostać się do wymaganego tekstu, który jest poza ekranem) . Spinner wykorzystuje ArrayAdapter obiektów niestandardowych (kod poniżej)Dynamiczne spinner espresso testowanie

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; 
     } 
    } 
} 

Próbowałem z onData(withSpinnerText("Twenty")).perform(click()) ale dostać PerformException i próbowałem dowiedzieć się, w jaki inny sposób dopasować prawidłowy pogląd oparty na danym tekście, w turbinki popupwindow, ale nie mógł dowiedzieć się, jak to zrobić.

Każda pomoc zostanie bardzo doceniona.

TIA

+0

Czy możliwe jest dołączenie wykonywanego wyjątku, który widzisz, z narzędziem dopasowującym SpinnerText? –

Odpowiedz

4

znalazł sposób, aby to zrobić i tak zaksięgowania odpowiedź moje własne pytanie.

musiałem utworzyć niestandardowe matcher dla mojego obiektu, a następnie użyć że z 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); 
     } 
    }; 
} 

które następnie mogą być wykorzystane jako (po kliknięciu na turbinki, aby wyświetlić listę rozwijaną)

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

0

Wydaje Twój Spinner ma widok rozwijaną, zanim mySpinner.setAdapter(adapter);

proszę dodać ten wiersz:

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