Café expresso: Por que os giradores não fecham após a seleção?
Tenho uma pergunta sobre a seleção de itens no Spinners com Espresso. Ou, para ser mais exato: a seleção funciona, mas depois disso as asserções de exibição falham porque o botão giratório ainda está aberto.
Digamos que eu tenha uma atividade realmente simples que contenha um botão giratório e uma exibição de texto que mostre a seleção, assim:
Agora, escrevi um teste do Espresso que seleciona 'cães' e verifica se a visualização de texto é atualizada de acordo:
@Test
public void selectDogs() throws Exception {
onData(allOf(is(instanceOf(String.class)), is("dogs")))
.inAdapterView(withId(R.id.spinner))
.perform(click());
onView(withId(R.id.selected)).check(matches(withText("dogs")));
}
Esse teste falha porque oonData()...perform(click());
não fecha o botão giratório, apenas o deixa aberto. Verificado através de depuração:
A exceção é:
android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with id: org.flinc.app:id/selected
If the target view is not part of the view hierarchy, you may need to use Espresso.onData to load it from one of the following AdapterViews:android.widget.ListPopupWindow$DropDownListView{226cb88 VFED.VC.. .F...... 0,0-231,432}
Eu posso (mais ou menos) corrigir meus testes adicionandopressBack()
após a seleção do girador, mas para mim isso não pode ser a solução correta. Também causa problemas no emulador, mas parece funcionar bem no meu dispositivo. Como selecionar corretamente algo no botão giratório e depois fechá-lo?
Muito obrigado por ajudar!
Aqui está o código de atividade para referência:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_spinner);
Spinner spinner = (Spinner) findViewById(R.id.spinner);
final TextView selected = (TextView) findViewById(R.id.selected);
final List<String> items = Arrays.asList("cats", "dogs", "unicorns");
final ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, items);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
selected.setText(items.get(position));
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
selected.setText("");
}
});
}