8

Sto provando a testare uno Spinner generato dinamicamente. Sono in grado di fare clic sulla casella di selezione, ma poi ho bisogno di selezionare un'opzione dalla lista con un dato testo che viene mostrato (ho scoperto da hierarchyviewer che una finestra popup è mostrata ma non riesco a ottenere il testo richiesto che è fuori schermo) . Il filatore utilizza un ArrayAdapter di oggetti personalizzati (codice qui sotto),test dinamico spinner espresso

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

ho provato con onData(withSpinnerText("Twenty")).perform(click()) ma ottengo un PerformException e ho cercato di scoprire in quale altro modo per abbinare la corretta visione sulla base di un dato testo, nel filatore popupwindow ma non riuscivo a capire come farlo.

Qualsiasi aiuto sarebbe molto apprezzato.

TIA

+0

E 'possibile allegare un'eccezione di esecuzione che si vede e con matcherSpinnerText? –

risposta

4

ha trovato un modo per fare questo e quindi inviare la risposta al la mia stessa domanda

ho dovuto creare un matcher personalizzato per il mio oggetto e quindi utilizzare tale con il 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); 
     } 
    }; 
} 

che poi potrebbe essere utilizzato come (dopo aver fatto clic sul filatore per visualizzare il menu a discesa)

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

0

Sembra che il tuo Spinner non ha vista a discesa, prima di mySpinner.setAdapter(adapter);

prega di aggiungere questa linea:

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