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

Erro no meu projeto: buildConfigField

Ola bom dia,

O hoje quando eu entro no android-studio no projeto ele esta pedindo para atualizar, e as class ListaLeilaoTelaTest e ViewMatcher esta toda quebrada varios metado esta quebrado, e eu atualizei achando que ia resolve mais nao.

No console aparece o erro "URL_BASE":

INFO: BuildType(simulado): buildConfigField 'URL_BASE' value is being replaced: "http:/###.###.##.#:8080/" -> "http://###.###.##.#:8081/"
Affected Modules: app

E os dois servidor esta funcionado normamente.

Class ListaLeilaoTelaTest.java:

package br.com.alura.leilao.ui.recyclerview.adapter;

import android.content.Intent;

import java.io.IOException;

import br.com.alura.leilao.R;
import br.com.alura.leilao.api.retrofit.client.TesteWebclient;
import br.com.alura.leilao.model.Leilao;
import br.com.alura.leilao.ui.activity.ListaLeilaoActivity;

import static br.com.alura.leilao.matchers.ViewMatcher.apareceLeilaoPosicao;

public class ListaLeilaoTelaTest{

    private static final String ERRO_FALHA_LIMPEZA_DADOS_API = "Banco de dados nao foi limpo";
    private static final String LEILAO_NAO_FOI_SALVO = "Leilao nao foi salvo";

    @Rule
    public ActivityTestRule<ListaLeilaoActivity> activity = new ActivityTestRule<>(ListaLeilaoActivity.class, true, false);
    private final TesteWebclient webclient = new TesteWebclient();

    @Before
    public void setUp() throws IOException{
        limpa_Bd_Api();
    }

    @Test
    public void get_ShowUmLeilao() throws IOException{

        tentaSalvaLeilao_Api(new Leilao("Carro"));
        activity.launchActivity(new Intent());

        onView(withId(R.id.lista_leilao_recyclerview)).check(matches(apareceLeilaoPosicao(0, "Carro", 0.00)));
    }

    @Test
    public void get_Show2Leiloes() throws IOException {
        tentaSalvaLeilao_Api(new Leilao("Carro"), new Leilao("Computador"));
        activity.launchActivity(new Intent());

        onView(withId(R.id.lista_leilao_recyclerview)).check(matches(apareceLeilaoPosicao(0, "Carro", 0.00)));
        onView(withId(R.id.lista_leilao_recyclerview)).check(matches(apareceLeilaoPosicao(1, "Computador", 0.00)));
    }

    private void limpa_Bd_Api() throws IOException {
        boolean bd_notclear = !webclient.limpaBancoDados();
        if (bd_notclear) {
            Assert.fail(ERRO_FALHA_LIMPEZA_DADOS_API);
        }
    }

    private void tentaSalvaLeilao_Api(Leilao... leilaos) throws IOException{
        for (Leilao leilao : leilaos){
            Leilao leilaoSalvo = webclient.salva(leilao);
            if(leilaoSalvo == null){
                Assert.fail(LEILAO_NAO_FOI_SALVO + leilao.getDescricao());
            }
        }
    }

    @After
    public void tearDown() throws IOException {
        limpa_Bd_Api();
    }
}
6 respostas

Aqui outra class ViewMatcher:

package br.com.alura.leilao.matchers;

import android.support.test.espresso.matcher.BoundedMatcher;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.TextView;

import org.hamcrest.Description;
import org.hamcrest.Matcher;

import br.com.alura.leilao.R;
import br.com.alura.leilao.formatter.FormatadorDeMoeda;

import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;

public class ViewMatcher {

    private static Matcher<View> displayed = isDisplayed();

    public static Matcher<? super View> apareceLeilaoPosicao(final int posicao, final String descricaoEsperada, final double maiorLance){

        return new BoundedMatcher<View, RecyclerView>(RecyclerView.class){

            private final FormatadorDeMoeda formatador = new FormatadorDeMoeda();
            private final String maiorLanceFormatador = formatador.formata(maiorLance);

            @Override
            public void describeTo(Description description){
                description.appendText("View com descricao ").appendValue(descricaoEsperada).appendText(", maior lance ").appendValue(maiorLanceFormatador)
                        .appendText(" na posicao ").appendValue(posicao);
                description.appendDescriptionOf(displayed);
            }

            @Override
            protected boolean matchesSafely(RecyclerView item){

                RecyclerView.ViewHolder viewHolder = item.findViewHolderForAdapterPosition(posicao);

                if(viewHolder == null){
                    throw new IndexOutOfBoundsException("View do ViewHolder na posicao " + posicao + " nao foi encontrada");
                }

                View view = viewHolder.itemView;
                boolean temDescricao = verificaDescricao(view);
                boolean temMaiorLance = verificaMaiorLance(view);
                displayed = isDisplayed();

                return temDescricao && temMaiorLance && displayed.matches(viewHolder);  //  temMaiorLance && isDisplayed().matches(viewHolder) <-- este codigo serve para verificar se ta visível
            }

            private boolean verificaMaiorLance(View view){
                TextView viewMaiorLance = view.findViewById(R.id.item_leilao_maior_lance);
                return viewMaiorLance.getText().toString().equals(maiorLanceFormatador);
            }

            private boolean verificaDescricao(View view){
                TextView textViewDescricao = view.findViewById(R.id.item_leilao_descricao);
                return textViewDescricao.getText().toString().equals(descricaoEsperada);
            }
        };
    }
}

E o app do meu projeto:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "br.com.alura.leilao"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    testBuildType = "simulado"

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            buildConfigField('String', 'URL_BASE', '"http:/###.###.##.#:8080/"')
        }
        simulado {
            initWith(buildTypes.debug)
            buildConfigField('String', 'URL_BASE', '"http://###.###.##.#:8081/"')
        }
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    testImplementation 'org.hamcrest:hamcrest-all:1.3'
    testImplementation 'org.mockito:mockito-core:2.15.0'
    implementation 'com.android.support:recyclerview-v7:28.0.0'
    implementation 'com.android.support:design:28.0.0'
    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.11.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
}

Como eu faz para eu voltar compilar as dois class?

Oi Guilherme, tudo bem?

De acordo com a mensagem que vc mandou, não indica um erro, ou seja, precisa do erro de compilação apresentado para entender o motivo.

Caso não aparecer o erro, mande o seu projeto via GitHub que eu dou uma olhada no que está acontecendo.

[]s

Bom dia, Alex?

No console aparece icone de alerda sobre o plugin android gradle:

BuildType(simulado): buildConfigField 'URL_BASE' value is being replaced: "http://###.###.##.##:8080/" -> "http://###.###.##.###:8081/"

E as classe ViewMatcher e a ListaLeilaoTelaTest e seu metado para fazer os teste, nao funcionando.

As biblioteca não estão sendo encontradas.

Muito provavelmente é um problema de build, pode ser que o arquivo build.gradle está com algum detalhe ou até mesmo se limpar o projeto e fazer o processo de rebuild funcione.

Sendo assim, compartilhe comigo o seu projeto via GitHub, dessa forma eu farei o download e também vou testá-lo para verificar se tem algum problema, caso encontrar o motivo eu te mando um feedback mais preciso do que aconteceu e como pode ser resolvido, o que acha?

[]s

Ola Alex, tudo bem.

Aqui o link do projeto: https://github.com/guireino/android-teste-espresso-parte-2-projeto-inicial

solução!

Oi Guilherme, tudo bem?

Acabei de baixar o seu projeto e executei sem nenhum problema, a única mudança que fiz foi no build.gradle que estava com o plugin do Gradle para a versão 3.5 do AS, eu alterei para a versão 3.3.2:

buildscript {

    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.2'


        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

O warning é esperado, pois ele está indicando a mudança da variável de build.

Minha sugestão para que funcione é realizar os seguinte procedimentos de limpeza do projeto e Android Studio que são ensinados neste exercício do curso de fundamentos de Android.

Faça o teste e veja se funciona, caso não der certo, apague o projeto, baixe novamente o seu projeto pelo github que me enviou, abra-o e tente executá-lo.

[]s