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

255

Para meus testes de instrumentação, eu estava usando

@RunWith(AndroidJUnit4.class)

de

import androidx.test.runner.AndroidJUnit4;

para estabelecer meus casos de teste. Agora essa linha é marcada como obsoleta com a dica para usar AndroidJUnit4em

import androidx.test.ext.junit.runners.AndroidJUnit4

No entanto, se eu tentar importar AndroidJUnit4do pacote nomeado, recebo o erro, isso extnão pode ser resolvido.

Você tem uma idéia, qual pacote deve ser incluído no gradle para resolver esse problema?

Marcel Gangwisch
fonte
4
Eu acho que sua fonte é obsoleta, eles não mencionam o androidx.
Marcel Gangwisch
1
O teste de unidade no Android é uma bagunça total de bugs e depreciações. A única coisa que funciona para mim é criar um novo projeto inicial, copiar os arquivos relevantes desse projeto para o meu, alternar para o modo de depuração e fazer uma invalidação completa do cache. Também para testes AndroidJUnit4, o nome do pacote deve corresponder ao nome do pacote da biblioteca.
Rupert Rawnsley

Respostas:

377

De acordo com a documentação para AndroidJUnit4 ,

  1. O arquivo gradle deve conter a seguinte linha: androidTestImplementation 'androidx.test.ext:junit:1.1.1'

  2. Mude a classe de teste para AndroidJUnit4ClassRunnerdeAndroidJUnit4

Se ainda assim não funcionar, limpe e / ou reconstrua seu projeto. Além disso, você pode verificar a versão atual diretamente no repositório maven do Google

Marcel Gangwisch
fonte
20
meu aluno tem isso e ainda não consegue resolver o problema.
Zuko 01/12/19
@zuko Limpe e / ou reconstrua seu projeto, ele deve estar lá. Se ainda não estiver e você estiver usando módulos, verifique se sua hierarquia de dependências está configurada conforme o esperado; pode ser necessário adicioná-los também aos módulos de nível superior - já que as bibliotecas de teste não são compiladas em módulos compartilhados para serem usadas pelos módulos upstream.
John Adams
@ JonAdams minha árvore de dependência continuava segurando uma referência a bibliotecas mais antigas por algum motivo, embora eu pensasse que as tinha removido. então, depois de tentar várias coisas, acabei migrando o projeto para um novo e agora está tudo bem.
Zuko
7
Também devemos alterar testInstrumentationRunner no arquivo gradle de androidx.test.runner.AndroidJUnitRunner para androidx.test.ext.junit.runners.AndroidJUnit4 ? Apenas querendo saber se há uma incompatibilidade.
A Droid
22
@A Droid Substitua o pacote AndroidJUnit4 antigo na importação por um novo. Basta substituir import androidx.test.runner.AndroidJUnit4; com import androidx.test.ext.junit.runners.AndroidJUnit4;
Xplosive
28

Se você tentou a solução do @ MarcelGangwisch e sua compilação falhou, dizendo que não consegue encontrar o recurso E você também limpou / reconstruiu seu projeto e ele ainda não funciona, tente o seguinte: (baseado também na solução do @ KrzysztofDziuba)

No seu arquivo gradle em que você alterou a dependência, certifique-se de adicioná-lo como o tipo necessário, ou seja:

Para testes de interface do usuário:

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

Para testes de unidade:

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

No meu exemplo, eu adicionei como ambos e agora funciona.

JJ Du Plessis
fonte
13

Solução

  1. Adicione esta linha ao build.gradle: androidTestImplementation 'androidx.test.ext:junit:1.1.1'

  2. Mude AndroidJUnit4para AndroidJUnit4ClassRunnerna classe de teste

Aviso

Eu recebi o mesmo erro, mas a seguinte solução falhou para mim:

Arquivo -> Invalidar caches ... e selecione Invalidar e reiniciar

HeshanHH
fonte
12

Para mim, as seguintes etapas funcionaram:
1. Substitua as bibliotecas androidx pela postada aqui . minha final app/build.gradleficou assim:

android {
    ...
    defaultConfig {
        ...
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

    }
    ...
}

dependencies {
    ...
    testImplementation 'junit:junit:4.12'

    // Core library
    androidTestImplementation 'androidx.test:core:1.2.0'

    // AndroidJUnitRunner and JUnit Rules
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test:rules:1.2.0'

    // Assertions
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.ext:truth:1.2.0'
    androidTestImplementation 'com.google.truth:truth:0.42'

    // Espresso dependencies
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

}

Em seguida, substituí manualmente os módulos importados da minha ExampleInstrumentTest.javaclasse pelas classes mais recentes:

import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(AndroidJUnit4ClassRunner.class)
public class ExampleInstrumentedTest {
    ...
    @Rule
    public final ActivityTestRule<MainActivity> main = new ActivityTestRule<>(MainActivity.class, true);

    @Before
    public void init() {
        ...
    }
    @Test
    public void listCount() {
        ...
    }

    @Test
    public void useAppContext() {
        Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();

        Assert.assertEquals("in.curioustools.aad_x_testing2", appContext.getPackageName());
        System.out.println("useAppContext : Test Ran");
    }
}

O que estava me incomodando era o fato de a InstrumentationRegisteryclasse ainda estar obsoleta. Então eu usei InstrumentationRegistry.getInstrumentation().getTargetContext();da androidx.test.platform.app.InstrumentationRegistryclasse.

ansh sachdeva
fonte
3
@RunWith(AndroidJUnit4ClassRunner.class)foi a parte que resolveu o problema no meu caso. Realmente não entendo por que o android studio gera código obsoleto às vezes.
Rafsanjani
Use em ApllicationProvider.getApplicationContext<Context>()vez deInstrumentationRegistry.getInstrumentation().getTargetContext();
Mitch
7

Eu tentei tudo o que foi mencionado acima até acessar o site oficial do Android, e eles sugeriram a importação de e androidx.test.ext.junit.runners.AndroidJUnit4não androidx.test.runner.AndroidJUnit4. ligação

Prox
fonte
0

Se você importou essas bibliotecas de teste do AnroidX, sincronizou e reconstruiu o projeto, mas os pacotes importados ainda não foram resolvidos. Lembre-se de como você atualizou seu projeto para o AndroidX, feche o Android Studio e remova a .ideapasta e reabra seu projeto novamente ...

Isso funcionou para mim!

Jeff T.
fonte
0
  1. Inclua essas linhas no módulo de aplicativo build.gradle.

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

  2. Na classe de teste, substitua seu executor de testes por

    importar androidx.test.ext.junit.runners.AndroidJUnit4;

  3. Se InstrumentationRegistry.getTargetContext()é o uso obsoleto InstrumentationRegistrya partir androidx.test.platform.appdesta

    InstrumentationRegistry.getInstrumentation (). GetTargetContext ()

Balsamiq
fonte