Não é possível resolver o símbolo 'AndroidJUnit4'

139

Obviamente, preciso da declaração de importação correta para resolver esse problema. De acordo com os documentos paraAndroidJUnit4 , isso deve ser

import android.support.test.runner.AndroidJUnit4;

Quando faço isso, o Android Studio destaca runnerem vermelho e reclama "Não é possível resolver o símbolo 'corredor'".

fundo

Cheguei a esse ponto seguindo os tutoriais no site Android Developer para configurar testes usando o UI Automator . O primeiro problema que encontrei foi isso com.android.support:support-v4:22.2.0e com.android.support.test:runner:0.2depende de diferentes versões do com.android.support:support-annotations. Segui as sugestões deste relatório de bug do Android e adicionei o seguinte allprojectsno meu projeto build.gradle:

configurations.all {
    resolutionStrategy.force 'com.android.support:support-annotations:22.1.0'
}

Isso resolveu o erro imediato, mas suspeito que isso tenha causado meus problemas atuais. Alguém tem alguma sugestão sobre como corrigir isso?

Seções relevantes de `./gradlew: app: dependencies

androidTestCompile - Classpath for compiling the androidTest sources.
+--- com.jayway.android.robotium:robotium-solo:5.2.1
+--- com.squareup:fest-android:1.0.8
|    \--- org.easytesting:fest-assert-core:2.0M10
|         \--- org.easytesting:fest-util:1.2.5
+--- com.android.support.test:runner:0.2
|    +--- junit:junit-dep:4.10
|    |    \--- org.hamcrest:hamcrest-core:1.1
|    +--- com.android.support.test:exposed-instrumentation-api-publish:0.2
|    \--- com.android.support:support-annotations:22.0.0 -> 22.2.0
+--- com.android.support.test:rules:0.2
|    \--- com.android.support.test:runner:0.2 (*)
\--- com.android.support.test.uiautomator:uiautomator-v18:2.1.0

compile - Classpath for compiling the main sources.
+--- com.android.support:appcompat-v7:22.2.0
|    \--- com.android.support:support-v4:22.2.0
|         \--- com.android.support:support-annotations:22.2.0
+--- com.android.support:support-v4:22.2.0 (*)
+--- com.google.android.gms:play-services:6.1.71
|    \--- com.android.support:support-v4:20.0.0 -> 22.2.0 (*)
+--- com.crashlytics.android:crashlytics:1.+ -> 1.1.13
\--- com.jakewharton:butterknife:5.1.2
Code-Apprentice
fonte
Isso sugere que sua compilação está faltando com.android.support.test:runnercompletamente. Você pode confirmar por meio de gradle dependenciesque ainda está fazendo isso após a resolutionStrategyalteração?
CommonsWare
@CommonsWare Adicionadas dependências à minha pergunta. Não sei o que (*)significa depois com.android.support.test:runner:0.2.
Code-Apprentice
De acordo com o pessoal da Gradle , o asterisco "significa que a visualização em árvore do gráfico de dependência é cortada neste momento, porque essa parte do gráfico já estava listada anteriormente". Estou perplexo com o motivo de isso não estar funcionando para você.
CommonsWare
1
Observe que a resposta de @stemadsen de 2018 é potencialmente mais relevante que as outras. Alguém escreveu uma vez sobre um teste que manteve as perguntas do mesmo ano após ano, mas as respostas mudaram ...
Roy Falk

Respostas:

197

Verifique se seu aplicativo na variante de compilação de depuração. Vá para Build> selecione Build Variant ... e o seguinte deve aparecer:

insira a descrição da imagem aqui

orium
fonte
5
Obrigado, você me salvou
Sofa
10
Saúde. A documentação nunca declara "esse material funcionará apenas na depuração". Tão frustrante.
Chantell Osejo
26
Uau. Up-Vote x 1 milhão. Esta é a resposta que eu tenho procurado por dias. Também foi encontrado para que você possa alterar o tipo de construção a ser usado. android { testBuildType "staging"}
WIllJBD
5
Vou ter que registrar um relatório de bug para isso com a equipe das Ferramentas do Android Studio. Mesmo tipos de compilação que herdam debugnão funcionam a menos que explicitamente definido como "debug"
Gautham C.
1
uau, eu estou usando um buildType de corte com initWith (buildTypes.debug) e ainda falha. Somente e somente se eu estiver usando o debug funciona diretamente!
289 Karoly
119

Cometi o erro de colocar as classes de teste em src / test . Depois de movê-los para src / androidTest / java /, a dependência foi resolvida.

microfones
fonte
No meu caso a minha pasta de teste foi src / test, por algum motivo, então eu tinha que renomeá-lo para src / androidTest e resolveu meu problema, depois de 3 horas ...
Teo Inke
69

Ok, então aqui está o seu erro e o meu!

Se vamos escrever um pedaço de código para o teste de unidade local , não devemos usá-lo @RunWith(AndroidJUnit4.class)porque não usamos o AndroidJUnit4, mas precisamos do Junit4. então devemos escrever @RunWith(JUnit4.class). E é claro que seu arquivo de teste java está no app/src/test/java/your.package.namediretório

Caso contrário, se (!!) quisermos escrever algum Teste de Unidade Instrumentada Android , devemos colocar nossos arquivos java de teste no app/src/androidTest/java/your.package.namediretório e usar anotações como@RunWith(AndroidJUnit4.class)

Sepehr Behroozi
fonte
Estou usando o Maven, e então?
31917 JohnyTex
2
@JohnyTex O uso do Maven não afeta minha resposta. Depende apenas da estrutura do arquivo do projeto.
Sepehr Behroozi
34

Atualizar

A Biblioteca de teste do Android agora faz parte do AndroidX. Certifique-se de usar as dependências corretas de Gradle encontradas na documentação oficial .

Resposta original

Eu descobri aqui que existem versões mais recentes da Biblioteca de Suporte ao Teste do que o que eu estava usando:

dependencies {
    androidTestCompile 'com.android.support.test:runner:0.5'
    androidTestCompile 'com.android.support.test:rules:0.5'
    androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
}

Nota: Certifique-se de usar as versões mais recentes dessas bibliotecas. Esta pergunta é de uma época em que a Biblioteca de suporte a testes do Android era nova e os números de versão aqui estão muito desatualizados.

Code-Apprentice
fonte
3
Eu me pergunto por que a documentação não menciona nada sobre isso, a menos que eu tenha perdido. Teria me poupado um pouco de tristeza.
Nom1fan
@Karoly ainda tenho problema. Você achou alguma solução?
Mahdi
26

Resolvi o problema fazendo uma pequena alteração no arquivo build.gradle do aplicativo. Na dependencies { ... }seção, inclua a seguinte linha:

debugImplementation 'com.android.support.test:runner:1.0.1'

ou qualquer versão mais recente nesse momento ( ...Compilefoi descontinuada e foi substituída por ...Implementation). Observe o uso de debugImplementation. O Android Studio sugeriu incluí-lo automaticamente comandroidTestImplementation , o que não funcionou.

Eu descobri como alterá-lo de teste para depuração, procurando em Estrutura do projeto em Dependências do módulo de aplicativo, onde você pode alterar o escopo de cada dependência, veja abaixo.

Estrutura do projeto

stemadsen
fonte
Observe que isso compilará a biblioteca de suporte ao teste no APK.
Code-Apprentice
Também funciona com testImplementation "com.android.support.test: rules: 1.0.2"
Prat
10

Observe que este OP está agora em 2019, com 4 anos. Portanto, se você estiver usando o Android X, AndroidJUnit4.classestá obsoleto, há um erro e mais um com esteandroidx.test.ext.junit.runners.AndroidJUnit4 . Sugiro ler esses links para resolver o problema.

AndroidJUnit4.class está obsoleto: Como usar androidx.test.ext.junit.runners.AndroidJUnit4?

Migrando testes Junit4 para androidx: o que faz com que 'o delegado corredor não pôde ser carregado'? Para mim, o Android Studio sugeriu substituir

@RunWith(AndroidJUnit4.class)

que foi preterido com

@RunWith(AndroidJUnit4ClassRunner.class)

e isto

androidx.test.ext.junit.runners.AndroidJUnit4

com isso

import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner;

Depois que o erro se foi, mas eu não sei se o teste futuro enquanto estiver funcionando ok ?!

leonidaa
fonte
@ Code-Apprentice - Muito obrigado para edição, é muito mais agradável agora
leonidaa
8

No meu caso, isso ajudou a variante de lançamento:

android {
    ...
    testBuildType "release" 
}
Andrew Glukhoff
fonte
Você pode dar uma solução mais completa. Eu não entendo o contexto do que você fez.
Code-Apprentice
Eu encontrei o problema "Não é possível resolver o símbolo 'AndroidJUnit4'" no meu teste de café expresso quando alterei a variante de compilação para "release". Assim que adicionei esta declaração (testBuildType "release") ao build.gradle no nível do aplicativo (extraído de developer.android.com/studio/test/index.html#add_a_new_test ), esse problema desapareceu.
Andrew Glukhoff
Formatei sua resposta no código da sua resposta. Você deve adicionar mais detalhes, como o link do seu comentário, e descrever para onde esse bloco vai no seu projeto.
Code-Apprentice
7

A causa comum desse problema é que, ao adicionar abaixo a dependência:

androidTestImplementation 'androidx.test.ext:junit:1.1.1'

Essa é uma dependência correta se você for usar testes instrumentados (testes no androidTest pacote java)

Mas para implementar testes de unidade local (testes no testpacote java) enquanto usa a dependência mencionada acima; então você vai enfrentarCannot resolve symbol 'AndroidJUnit4'

Isso é porque androidTestImplementation diretiva é usada para importar bibliotecas em testes instrumentados, mas não nos testes locais da JVM / unidade.

Se você deseja usar AndroidJUnit4em um JVM local / teste de unidade, use a dependência abaixo em vez disso

testImplementation 'androidx.test.ext:junit:1.1.1'

O mesmo se aplica se você adicionar a última dependência ao usar AndroidJUnit4no teste instrumentado, você também receberá Cannot resolve symbol 'AndroidJUnit4'; porque você está usando a diretiva errada.

Zain
fonte
1
No cenário da minha pergunta original, eu estava executando testes instrumentados. No entanto, essa é uma grande distinção a ser feita e, com sorte, ajudará os visitantes a essa pergunta no futuro.
Code-Apprentice
5

Se alguém ainda tiver esse problema:

Não é possível resolver o símbolo 'AndroidJUnit4'

e usando a API 27, no build.gradlemódulo que está no aplicativo, adicione as seguintes linhas:

testImplementation 'junit:junit:4.12'

// AndroidJUnitRunner and JUnit Rules
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test:rules:1.0.2'

// Espresso dependencies
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
tm81
fonte
3

coloque esse código em suas dependências

compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
})
Paramatma Sharan
fonte
1
Quando escrevi essa pergunta, ainda não havia adicionado o café expresso como uma dependência para testes de unidade.
Code-Apprentice
+1 Eu realmente descobri isso antes de ver isso, mas sim, foi o que fiz e resolvi o meu problema.
Tony D
2
Siga as duas respostas abaixo em @sepehr. A classe AndroidJunit4 não está no pacote de café expresso e está presente no pacote android.support.test.runner. e tudo o que você precisa fazer é incluir @Runwith (AndroidJunit4.class) na gravação acima / para o caso de teste presente em src / Androidtest / java, INSTED OF incluindo nos casos de teste escritos em src / test / java.
Khay
2

Se você estiver usando um projeto com vários tipos de construção, o tipo de construção selecionado na janela variante de construção deverá ser mencionado com a tag testBuildType no arquivo build.gradle do módulo.

Por exemplo: se você estiver usando o tipo de compilação debug , deverá adicionar android{testBuildType "debug" }, se estiver usando stage , adicione a android{testBuildType "stage"}instrução na tag android.

Rahul Rastogi
fonte
Você está sugerindo editar o arquivo de compilação se quiser mudar a variante que está sendo testada?
Nasch 24/10/19
2

Mova a classe de teste para src / androidTest / java /. Então a dependência será resolvida.

Komal Nikhare
fonte
Lol ... realmente ...
Manish Kumar Sharma
1

O clássico Invalidate Caches / Restart me ajudou! :)

user_MGU
fonte
1

Inclua esta dependência no seu arquivo build.gradle:

androidTestImplementation 'androidx.test.ext:junit:1.1.1'

Atualize a versão final ( 1.1.1) com a versão mais recente lançada.

KOUSHIKZEP99
fonte
0

Adicionando

compile com.android.support.test:runner:0.5'

resolveu esse problema exato para mim.

donlys
fonte
Isso já está indicado na resposta aceita. Você também deve ver se há uma versão mais recente e usá-la.
Aprendiz de código 31/03
AndroidTestCompile é o mesmo que compilar?
donlys
compilediretivas dependem de nomes usados ​​no aplicativo principal, enquanto androidTestComipledependem de nomes usados ​​para teste. Portanto, a resposta correta é usar androidTestCompile, não compile.
Code-Apprentice
0

Como a lista de respostas demonstra, isso pode ser causado por algumas coisas. Mais um para a lista:

Executei um LINT excessivamente zeloso que removeu todas as importações não utilizadas. Isso produzirá os mesmos erros e é fácil esquecer que esse é o problema.

O Android-studio destacará as referências que estão faltando no código de teste - e o pop-up ALT-ENTER será exibido (esse é o ponto mais fácil de perder).

Em seguida, preciso remover os testes do LINT - ou pelo menos desativar esse aviso.

Edit: @ Code-Apprentice, as linhas que estavam faltando foram:

import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;


import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

Portanto, o primeiro erro no arquivo ocorreu @RunWith(AndroidJUnit4.class)no início da minha classe de teste.

winwaed
fonte
Você pode mostrar um exemplo de teste onde isso aconteceu para você?
Code-Apprentice
0

Versão curta:

Atualize seu Gradle para a versão mais recente

Estou respondendo a esta pergunta em 15 de fevereiro de 2020. Infelizmente, eu esgotei todas as soluções possíveis mencionadas aqui e em outros lugares.

Sim, nenhum deles acima funciona. Eu uso a função interna "Migrar para Andoridx". Isso pode me lembrar que eu tenho que atualizar minhas versões de SDK de destino e minha versão gradle. Depois de atualizar minha versão gradle de 2.0.2 para 3.5.3. Eles simplesmente funcionam, até a antiga declaração de importação funciona.

Bryan Zhang
fonte
Olá, esta é uma pergunta antiga que já tem uma resposta aceita e não consigo ver como sua resposta adiciona algo novo à pergunta. Evite responder se sua resposta não adicionar algo novo às respostas existentes. Obrigado
hippozhipos
A resposta aceita fornece um link para atualizar as dependências de teste na biblioteca de testes do AndroidX. Provavelmente, foi o que o corrigiu em todas as coisas que você tentou.
Code-Apprentice
0

O mesmo erro ocorreu quando eu sigo o aplicativo Google IOSched e configuro meu projeto com três tipos de compilação [depuração, liberação, teste] em que depuração e liberação compartilham o mesmo diretório de origem

sourceSets {
    debug.java.srcDir 'src/debugRelease/java'
    release.java.srcDir 'src/debugRelease/java'
}

Nesse caso, especifique o testBuildTypearquivo build.gradle no nível do módulo e o projeto agora poderá resolver o símbolo 'AndroidJUnit4'.

...
sourceSets {
    debug.java.srcDir 'src/debugRelease/java'
    release.java.srcDir 'src/debugRelease/java'
}

testBuildType "staging"
...

Referência: https://github.com/google/iosched/blob/master/mobile/build.gradle

Jie Heng
fonte