Olá a todos,
Venho partilhar uma possivel solução para a dificil tarefa de fazer um teste unitário que escolha a conta Google no objecto Picker.
Devido há falta de informação na web sobre este tema, achei interessante publicar.
O algoritmo é muito simples.
Vamos precisar dos Objetos:
Instrumentation para obter o controle do equipamento.
IntentFilter estrutura que vai servir para encontrar a informação que queremos.
Intent para criar o conjunto de ações que vão ser feitas;
ActivityResult para chamar a Atividade e devolver o resultado, neste caso será a conta Google.
ActivityMonitor será o nosso monitor que com base no filtro criado e a Activity consegue selecionar o Account. Será este objeto um dos mais importantes para conseguir selecionar o Account. No seu contrutor o primeiro parâmetro é o filtro sobre a informação que queremos "apanhar", o segundo parâmetro é Activity que vai ser lançada pelo Monitor e o terceiro é o Block de Instrumentação, True apenas o Monitor pode usar a Intrumentação neste instante, a False outros objetos podem utilizar a intrumentação.
Uma das tentações que temos é colocar este parâmetro a False para que o Solo também possa utilizar a Instrumentação o problema é que não funciona e o Monitor não consegue selecionar a conta. A solução mais adequada é após a Instanciação do Monitor adicionar o mesmo à Instrumentação, depois Instanciar o nosso Solo (Robotium) e logo a seguir remover o Monitor da Instrumentação.
Solo é o nosso objeto para utilizar o Robotium.
Assim o Monitor faz o seu trabalho e quando termina passa o controlo ao nosso Robotium :)
Com isto podemos usar o Solo para escrever ou clicar da forma natural para que foi concebido sem ter que usar funções do Java diretas para clicar nos botões.
Abaixo fica um exemplo de teste que seleciona uma conta Google, escreve o nome de utilizar e password e clica no botão Login.
public void testASelectAccount() throws InterruptedException{
Instrumentation inst = getInstrumentation();
IntentFilter filter = new IntentFilter("com.google.android.gms.common.account.CHOOSE_ACCOUNT");
Intent result = new Intent();
result.putExtra(AccountManager.KEY_ACCOUNT_NAME, "o_meu_emai_google@gmail.com");
ActivityResult act = new ActivityResult(Activity.RESULT_OK,result);
ActivityMonitor mon = new ActivityMonitor(filter, act, true); //Instanciação do Monitor
inst.addMonitor(mon); //Monitor adicionado à instrumentação
Solo solo=new Solo(inst, getActivity()); //Instanciação do Solo
inst.removeMonitor(mon); //Remoção do Monitor
//Solo no controle a inserir o nome de utilizar a password nas caixas de texto a clicar no botão de login
EditText user, password;
user = (EditText) solo.getView(R.id.txtUtilizador);
password= (EditText) solo.getView(R.id.txtPassword);
solo.clearEditText(user); //opcional se não estiverem a guardar dados
solo.clearEditText(password); //opcional se não estiverem a guardar dados
solo.clearEditText(password); //opcional se não estiverem a guardar dados
solo.typeText(user, "o_meu_nome");
solo.typeText(password, "a_minha_password");
Thread.sleep(2000);
Button btn = (Button)solo.getView(R.id.btnLogin);
solo.clickOnView(btn);
solo.waitForDialogToClose();
Thread.sleep(2000);
solo.waitForDialogToClose();
solo.assertCurrentActivity("Não foi possivel fazer login", MainActivity.class) ; //Verifica se entrou na aplicação
solo.finishOpenedActivities();
}
Comentários
Enviar um comentário