'AndroidJUnit4' sembolü çözülemiyor


139

Açıkçası bu sorunu çözmek için doğru ithalat beyanına ihtiyacım var. İçin dokümanlaraAndroidJUnit4 göre , bu olmalı

import android.support.test.runner.AndroidJUnit4;

Bunu yaptığımda, Android Studio runnerkırmızı renkte vurgulanıyor ve "Sembol 'koşucusu' çözülemiyor" şeklinde şikayet ediyor.

Arka fon

Bu noktaya, UI Automator kullanarak testler ayarlamak için Android Geliştirici sitesindeki eğiticileri izleyerek ulaştım . Karşılaştığım ilk sorun, com.android.support:support-v4:22.2.0ve com.android.support.test:runner:0.2farklı sürümlerine bağlıydı com.android.support:support-annotations. Bu Android hata raporundaki önerileri izledim ve allprojectsprojeme şunları ekledim build.gradle:

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

Bu acil hatayı çözdü, ancak mevcut sorunlarıma yol açtığından şüpheleniyorum. Herkes bu sorunu çözmek için herhangi bir öneriniz var mı?

./Gradlew: app: bağımlılıklarından ilgili bölümler

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

Bu, yapınızın tamamen eksik olduğunu gösterir com.android.support.test:runner. Değişiklikten gradle dependenciessonra bunu hala çektiğinizi onaylayabilir misiniz resolutionStrategy?
CommonsWare

@CommonsWare Soruma bağımlılıklar çıktısı eklendi. Sonra ne (*)anlama geldiğini bilmiyorum com.android.support.test:runner:0.2.
Code-Apprentice

Gradle milletlerine göre , yıldız işareti "bağımlılık grafiğinin ağaç görünümünün bu noktada kısa kesildiği anlamına gelir, çünkü grafiğin bu kısmı daha önce listelendi." Bunun sizin için neden işe yaramadığı konusunda şaşırıyorum.
CommonsWare

1
@Stemadsen'in 2018 yanıtının potansiyel olarak diğerlerinden daha alakalı olduğunu unutmayın. Birisi bir zamanlar soruları her yıl aynı tutan bir test hakkında yazdı, ancak cevaplar değişti ...
Roy Falk

Yanıtlar:


199

Hata ayıklama oluşturma varyantında uygulamanızın olduğundan emin olun. Gidin Yapı> Seç Yapı Varyant ... ve şu kadar göstermelidir:

resim açıklamasını buraya girin


5
Teşekkürler, beni kurtardın
Sofa

10
Seni korusun. Dokümantasyonda asla "bu şeyler sadece hata ayıklamada çalışır" ifadesi yer almaz. Çok sinir bozucu.
Chantell Osejo

27
Vay. Yukarı Oy x 1 milyon. Günlerdir aradığım cevap bu. Ayrıca bunun için hangi yapı türünü kullanacağınızı değiştirebilirsiniz. android { testBuildType "staging"}
WIllJBD

5
Android Studio Araçları ekibi ile bunun için bir hata raporu dosyalamam gerekecek. debugAçıkça "hata ayıklama" olarak ayarlanmadığı sürece , devralınan türler bile çalışmaz
Gautham C.

1
vay, initWith (buildTypes.debug) ile bir cutsom buildType kullanıyorum ve hala başarısız. Sadece ve sadece eğer doğrudan hata ayıklama kullanıyorsanız çalışır!
Karoly

120

Test sınıflarını src / test'e koymak için hata yaptım . Onları src / androidTest / java / klasörüne taşıdıktan sonra bağımlılık giderildi.


Benim durumumda test klasörüm herhangi bir nedenle src / testti, sonra src / androidTest olarak yeniden adlandırmak zorunda kaldım ve 3 saat sonra sorunumu çözdü ...
Teo Inke

69

Tamam işte senin hatan ve benim!

Yerel Birim Testi için bir kod kodu yazacaksak, kullanmamalıyız @RunWith(AndroidJUnit4.class)çünkü AndroidJUnit4 kullanmıyoruz, ancak Junit4'e ihtiyacımız var. bu yüzden yazmalıyız @RunWith(JUnit4.class). Ve tabii ki java test dosyanız app/src/test/java/your.package.namedizinin altında .

Else eğer (!!) bazı Android Enstrümanlı Birim Testi yazmak istiyorsak, test java dosyalarımızı app/src/androidTest/java/your.package.namedizine koymalıyız ve@RunWith(AndroidJUnit4.class)


Maven kullanıyorum, sonra ne olacak?
JohnyTex

2
@JohnyTex Maven kullanmak cevabımı etkilemez. Yalnızca proje dosya yapınıza bağlıdır.
Sepehr Behroozi

34

Güncelleme

Android Test Kitaplığı artık AndroidX'in bir parçası. Resmi belgelerde bulunan doğru Gradle bağımlılıklarını kullandığınızdan emin olun .

Orijinal Yanıt

Bulduğum burada ben kullanıyordum olandan Test Destek Kütüphanesi yeni sürümleri olduğunu:

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'
}

Not: Bu kitaplıkların en son sürümlerini kullandığınızdan emin olun. Bu soru, Android Test Destek Kitaplığı'nın yeni olduğu ve buradaki sürüm numaralarının çok eski olduğu bir zamandır.


3
Kaçırmadıkça, belgelerin neden bu konuda hiçbir şeyden bahsetmediğini merak ediyorum . Bana biraz keder kazandıracaktı.
Nom1fan

@Karoly Hala sorunum var. Herhangi bir çözüm buldunuz mu?
Mehdi

26

Uygulamanın build.gradle dosyasında küçük bir değişiklik yaparak sorunu çözdüm. Bölümde, dependencies { ... }aşağıdaki satırı eklediğinizden emin olun:

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

veya o noktada en yeni sürüm ...Compilehangisidir ( kullanımdan kaldırılmıştır ve onunla değiştirilmiştir ...Implementation). Not kullanımını debugImplementation. Android Studio androidTestImplementation, işe yaramadığı için otomatik olarak dahil etmeyi önerdi .

Her bir bağımlılığın kapsamını değiştirebileceğiniz uygulama modülünün Bağımlılıklar altında Proje Yapısı'na bakarak testten hata ayıklamaya nasıl değiştirileceğini öğrendim.

Proje yapısı


Bunun, test destek kitaplığını APK'ya derleyeceğini unutmayın.
Code-Apprentice

Ayrıca testImplementation "com.android.support.test: rules: 1.0.2" ile çalışır
Prat

10

Bu OP'nin 2019'da, 4 yaşında olduğuna dikkat edin, bu yüzden Android X kullanıyorsanız AndroidJUnit4.class, kullanımdan kaldırılmışsa, orada bir hata var ve bununla bir tane daha varandroidx.test.ext.junit.runners.AndroidJUnit4 . Sorunu çözmek için bu bağlantıları okumanızı öneririm.

AndroidJUnit4.class kullanımdan kaldırıldı: androidx.test.ext.junit.runners.AndroidJUnit4 nasıl kullanılır?

Junit4 testlerini androidx'e geçirme: 'Temsilci koşucusu yüklenemedi' nedenleri nelerdir? Benim için Android Studio'nun değiştirilmesini önerdi

@RunWith(AndroidJUnit4.class)

ile itiraz edildi

@RunWith(AndroidJUnit4ClassRunner.class)

ve bu

androidx.test.ext.junit.runners.AndroidJUnit4

Bununla

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

Bundan sonra hata gitti ama gelecekteki test çalıştırmak sırasında tamam olup olmadığını bilmiyorum ?!


@ Code-Apprentice
Düzenlediğiniz

8

Benim durumumda bu sürüm değişkenine yardımcı oldu:

android {
    ...
    testBuildType "release" 
}

Daha eksiksiz bir çözüm verebilir misiniz? Yaptıklarının bağlamını anlamıyorum.
Code-Apprentice

Oluşturma varyantını "serbest bırakma" olarak değiştirdiğimde, espresso testimde "AndroidJUnit4" sembolü çözülemiyor "sorunuyla karşılaştım. Bu ifadeyi (testBuildType "release") uygulama düzeyinde build.gradle'a ( developer.android.com/studio/test/index.html#add_a_new_test'ten alınmıştır ) ekler eklemez bu sorun ortadan kalktı.
Andrew Glukhoff

Cevabınızı, cevabınızdaki kodu biçimlendirdim. Yorumunuzdaki bağlantı gibi daha fazla ayrıntı eklemeli ve bu bloğun projenize nereye gittiğini açıklamalısınız.
Code-Apprentice

7

Bu sorunun ortak nedeni, aşağıdaki bağımlılığı eklerken:

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

Eğer enstrümanlı testler kullanacaksanız, bu doğru bir bağımlılıktır. androidTest java paketindeki

Ancak testyukarıda belirtilen bağımlılığı kullanırken yerel birim testlerini ( java paketindeki testler) uygulamak için ; o zaman yüzleşeceksinCannot resolve symbol 'AndroidJUnit4'

Çünkü androidTestImplementationyönerge, enstrümanlı testlerde kütüphaneleri içe aktarmak için kullanılır, ancak yerel JVM / birim testlerinde kullanılmaz.

AndroidJUnit4Yerel bir JVM / birim testinde kullanmak istiyorsanız , bunun yerine aşağıdaki bağımlılığı kullanın

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

Aynı şey AndroidJUnit4, enstrümanlı testte kullanırken ikinci bağımlılığı eklerseniz de geçerlidir Cannot resolve symbol 'AndroidJUnit4'; çünkü yanlış yönergeyi kullanıyorsunuz.


1
Orijinal sorumdaki senaryoda, enstrümanlı testler yapıyordum. Ancak, bu yapmak için büyük bir ayrımdır ve umarım gelecekte bu soruya ziyaretçilere yardımcı olacaktır.
Code-Apprentice

5

Hâlâ bu sorunu yaşayan biri varsa:

'AndroidJUnit4' sembolü çözülemiyor

ve build.gradleuygulama modülünde bulunan API 27'yi kullanarak aşağıdaki satırları ekleyin:

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'

3

bu kodu Bağımlılıklarınıza ekleyin

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'
})

1
Bu soruyu yazdığımda, birim testlere bağımlılık olarak espressoyu henüz eklememiştim.
Code-Apprentice

+1 Bunu görmeden hemen önce anladım, ama evet, ben de öyle yaptım ve sorunumu çözdü.
Tony D

2
@Sepehr'den aşağıdaki iki cevabı takip edin. AndroidJunit4 sınıfı, android.support.test.runner paketinde mevcut olan espresso paketinde değil. ve yapmanız gereken tek şey @Runwith (AndroidJunit4.class) yukarıda / src / Androidtest / java'da mevcut olan test senaryosu için, src / test / java altında yazılmış test vakaları dahil olmak üzere INSTED.
Khay

2

Birden çok derleme türüne sahip bir proje kullanıyorsanız, derlemenin varyant penceresinde seçilen derleme türünden modülün build.gradle dosyasındaki testBuildType etiketi ile belirtilmesi gerekir.

Örneğin: Derleme türü hata ayıklama kullanıyorsanız , eklemeniz gerekir android{testBuildType "debug" }, sahne alanı kullanıyorsanız android{testBuildType "stage"}android etiketine deyim ekleyin .


Test edilen varyantı değiştirmek istiyorsanız derleme dosyasını düzenlemeyi mi öneriyorsunuz?
nasch


1

Klasik Geçersiz Önbellek / Yeniden Başlatma bana yardımcı oldu! :)


1

Bu bağımlılığı build.gradle dosyanıza ekleyin:

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

Son sürümü ( 1.1.1) en son sürümle güncelleyin .


0

Ekleme

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

bu sorunu benim için çözdüm.


Bu zaten kabul edilen cevapta belirtilmiştir. Ayrıca daha yeni bir sürüm olup olmadığını görmeli ve bunun yerine bunu kullanmalısınız.
Code-Apprentice

AndroidTestCompile derleme ile aynı mıdır?
donlys

compiledirektifleri ana uygulamada androidTestComiplekullanılan bağımlılıkları adlandırırken test için kullanılan ad bağımlılıkları. Yani doğru cevap kullanmaktır androidTestCompile, değil compile.
Code-Apprentice

0

Cevaplar listesinin gösterdiği gibi, bu birkaç şeyden kaynaklanabilir. Liste için bir tane daha:

Kullanılmayan tüm ithalatı kaldıran gayretli bir LINT'i çalıştırdım. Bu aynı hataları üretir ve sorunun bu olduğunu kaçırmak kolaydır.

Android-studio, test kodunda eksik olan referansları vurgulayacaktır - ve ALT-ENTER pop-up'ı görünecektir (bu, kaçırılması kolaydır).

Sonra, testleri LINT'ten kaldırmam ya da en azından bu uyarıyı devre dışı bırakmam gerekiyor.

Düzenleme: @ Code-Apprentice, eksik olan satırlar:

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;

Dosyadaki ilk hata @RunWith(AndroidJUnit4.class)test sınıfımın başındaydı.


Bunun sizin için nerede olduğunu gösteren bir örnek test gösterebilir misiniz?
Kod Çırağı

0

Kısa Öykü Sürümü:

Gradle'ınızı en son Sürüme yükseltin

Bu soruyu 15 Şubat 2020'de yanıtlıyorum. Maalesef burada ve başka yerlerde bahsettiğim olası tüm çözümleri tükettim.

Evet, hiçbiri işe yaramıyor. Yerleşik "Andoridx'e Geç" işlevini kullanıyorum, hedef SDK sürümlerimi ve sınıf sürümümü yükseltmem gerektiğini hatırlatabilir. Gradle sürümümü 2.0.2'den 3.5.3'e yükselttikten sonra. Sadece çalışıyorlar, eski ithalat beyanı bile çalışıyor.


Merhaba, bu eski bir soru zaten kabul edilmiş bir cevabı var ve cevabınızın soruya yeni bir şey eklediğini göremiyorum. Cevabınız mevcut cevaplara yeni bir şey eklemiyorsa lütfen cevap vermekten kaçının. Teşekkürler
hippozhipos

Kabul edilen cevap, AndroidX Test kütüphanesine test bağımlılıklarını güncelleme bağlantısı verir. Bu muhtemelen denediğiniz her şeyde onu düzelten şeydir.
Code-Apprentice

0

Aynı hata Google IOSched uygulamasını izlediğimde ve hata ayıklamanın ve sürümün aynı kaynak dizini paylaştığı üç derleme türüyle [hata ayıklama, bırakma, evreleme] kurduğumda da aynı hata oluştu

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

Bu durumda, testBuildTypemodül düzeyinde build.gradle dosyanızı belirtin ve projenin şimdi 'AndroidJUnit4' sembolünü çözebilmesi gerekir.

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

testBuildType "staging"
...

Referans: https://github.com/google/iosched/blob/master/mobile/build.gradle

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.