Solucionado (ver solução)
Solucionado
(ver solução)
13
respostas

Erro no teste da class: ListaLeilaoTelaTest

Ola boa dia,

Estou com erro ao testar class ListaLeilaoTelaTest, aqui o erro que esta mostrando no terminal:

Testing started at 16:46 ...

01/10 16:46:13: Launching ListaLeilaoTelaTest
Running tests

$ adb shell am instrument -w -r   -e debug false -e class 'br.com.alura.leilao.ui.recyclerview.adapter.ListaLeilaoTelaTest' br.com.alura.leilao.test/android.support.test.runner.AndroidJUnitRunner
Client not ready yet..
Started running tests

android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with text: is "casa"

tambem class ListaLeilaoTelaTest:

public class ListaLeilaoTelaTest{

    @Rule
    public ActivityTestRule activity = new ActivityTestRule(ListaLeilaoActivity.class, true, true);

    @Test
    public void get_ShowUmLeilao(){
        Espresso.onView(ViewMatchers.withText("casa")).check(ViewAssertions.matches(ViewMatchers.isDisplayed()));
//        Espresso.onView(withText(endsWith("casa"))).check(matches(isDisplayed()));
    }
}

Lembrando que eu ja comentei:

//itemView.setVisibility(View.VISIBLE);
13 respostas

Oi Guilherme, tudo bem?

Se o leilão está aparecendo na tela é para o teste passar sem problemas. Consegue me mandar o seu código via GitHub para eu dar uma olhada?

[]s

Foi dar test no app e tem uma mensagem de erro no Logcat:

2019-01-14 15:43:20.400 4108-4128/br.com.alura.leilao D/OkHttp: <-- HTTP FAILED: java.net.SocketTimeoutException: failed to connect to /192.168.20.248 (port 8080) from /192.168.232.2 (port 58974) after 10000ms

Mais um coisa nao esta aparecendo os leilão no app, que eu criei no localhost e o servidor esta ligado seu erro no terminal.

post erro

Oi Guilherme, tudo bem?

Desculpe a demora, pelo o erro tudo indica que você não está conseguindo se conectar com o servidor por meio deste endereço.

Faça o seguinte teste, veja se a partir do endereço http://192.168.20.248 você consegue acessar o seu servidor via navegador do dispositivo.

Se não der certo, talvez o endereço esteja errado.

[]s

Bom dia,

Eu não consigo conectar como http://192.168.20.248, mais o servidor esta funcionando porque no localhost:8080 funcinar nomarmente, com os leilãos que eu criei.

Se o servidor está funcionando já temos o primeiro passo, sendo assim, vamos para os próximos testes:

Tente acessar o endereço http://192.168.20.248/ via navegador do seu computador, se funcionar, provalvemente o seu celular e o servidor não estão na mesma rede e vai ser necessário realizar essa configuração.

Caso isso não seja possível, existe uma alternativa para configurar o endereço do servidor como um endereço público usando o ngrok.

Apenas como desencargo de consciência, você fez a configuração no AndroidManifest para permitir a comunicação via HTTP?

Aqui codigo AndroidMainfest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="br.com.alura.leilao">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:usesCleartextTraffic="true"
        tools:targetApi="m"
        tools:ignore="GoogleAppIndexingWarning">
        <activity android:name=".ui.activity.ListaLeilaoActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".ui.activity.LancesLeilaoActivity" />
        <activity android:name=".ui.activity.ListaUsuarioActivity" />
    </application>

</manifest>

Ja to conecter com servidor ngrok, mais como eu conector emulador android no servidor ngrok?

Tudo parece ok no manifest, como você fez a configuração com o ngrok? No geral você faz o mapeamento do endereço que quer tornar público e ele cria um Forwarding indicando o endereço que pode ser usado. Inclusive, no próprio site mostra um exemplo a partir desta imagem

https://ngrok.com/static/img/ngrok-demo-static.png

Nesse caso o endereço de http://localhost:3000 está público a partir do endereço http://katesapp.ngrok.io. O seu apareceu conforme esse exemplo?

Como eu faco para emulador android entra no servidor ngrok?

Ele continua tentando conectar no 192.168.20.248.

Oi Guilherme, você precisa mudar o endereço da constante URL_BASE que fica na classe RetrofitInicializador.

Agora deu ser certo ta aparecendo os leilaos, mais o problema do teste da class ainda continua:

Testing started at 16:45 ...

01/18 16:45:52: Launching get_ShowUmLeilao()
Running tests

$ adb shell am instrument -w -r   -e debug false -e class 'br.com.alura.leilao.ui.recyclerview.adapter.ListaLeilaoTelaTest#get_ShowUmLeilao' br.com.alura.leilao.test/android.support.test.runner.AndroidJUnitRunner
Client not ready yet..
Started running tests

android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with text: is "casa"

Eu ja verifiquei o nome do leilao casa esta certo.

solução!

A parte boa é que resolvemos a comunicação com o server :)

Estou assumindo que está aparecendo na tela do dispositivo o texto "casa". Em casos que não funciona, pode ser pelo fato do Espresso executar o teste rapidamente e não esperar a resposta da comunicação com o servidor...

Nesses casos, podemos considerar o uso de um delay, tente adicionar o seguinte código antes de executar a verificação com o Espresso:

public class ListaLeilaoTelaTest{

    @Rule
    public ActivityTestRule activity = new ActivityTestRule(ListaLeilaoActivity.class, true, true);

    @Test
    public void get_ShowUmLeilao() throws InterruptedException {
        Thread.sleep(1000);
        Espresso.onView(ViewMatchers.withText("casa")).check(ViewAssertions.matches(ViewMatchers.isDisplayed()));
//        Espresso.onView(withText(endsWith("casa"))).check(matches(isDisplayed()));
    }
}

Isso é um detalhe que comento neste exercício. Faça o teste e veja se funciona.