Tidak dapat menyelesaikan simbol 'AndroidJUnit4'

139

Jelas saya perlu statment impor yang benar untuk menyelesaikan masalah ini. Menurut dokumen untukAndroidJUnit4 , ini seharusnya

import android.support.test.runner.AndroidJUnit4;

Ketika saya melakukan itu, Android Studio menyoroti runnerdalam warna merah dan mengeluh "Tidak dapat menyelesaikan simbol 'pelari'".

Latar Belakang

Saya sampai pada titik ini dengan mengikuti tutorial di situs Pengembang Android untuk mengatur tes menggunakan UI Automator . Masalah pertama yang saya temui adalah itu com.android.support:support-v4:22.2.0dan com.android.support.test:runner:0.2tergantung pada berbagai versi com.android.support:support-annotations. Saya mengikuti saran dari laporan bug Android ini dan menambahkan yang berikut ke allprojectsdalam proyek saya build.gradle:

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

Ini memecahkan kesalahan langsung, tetapi saya curiga ini mengarah ke masalah saya saat ini. Adakah yang punya saran tentang cara memperbaikinya?

Lepaskan bagian dari `./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
Magang-Kode
sumber
Itu menunjukkan bahwa bangunan Anda hilang begitu saja com.android.support.test:runner. Bisakah Anda mengonfirmasi gradle dependenciesbahwa Anda masih melakukan ini setelah resolutionStrategyperubahan?
CommonsWare
@CommonsWare Menambahkan output dependensi ke pertanyaan saya. Saya tidak tahu apa (*)artinya setelah itu com.android.support.test:runner:0.2.
Code-Apprentice
Menurut orang-orang Gradle , tanda bintang "berarti bahwa tampilan pohon dari grafik dependensi dipotong pendek pada titik ini karena bagian dari grafik sudah terdaftar sebelumnya." Saya bingung mengapa ini tidak berhasil untuk Anda.
CommonsWare
1
Perhatikan bahwa jawaban @stemadsen mulai 2018 berpotensi lebih relevan daripada yang lain. Seseorang pernah menulis tentang tes yang menyimpan pertanyaan tahun yang sama tahun demi tahun, tetapi jawabannya berubah ...
Roy Falk

Jawaban:

197

Pastikan aplikasi Anda dalam varian versi debug. Pergi ke Bangun> Pilih Bangun Varian ... dan yang berikut ini akan muncul:

masukkan deskripsi gambar di sini

orium
sumber
5
Terima kasih, Anda menyelamatkan saya
Sofa
10
Diberkatilah Anda. Dokumentasi tidak pernah menyatakan "hal ini hanya akan berfungsi dalam debug". Sangat membuat frustrasi.
Chantell Osejo
26
Wow. Up-Vote x 1 juta. Ini adalah jawaban yang saya cari selama berhari-hari. Juga menemukan ini sehingga Anda dapat mengubah tipe bangunan yang digunakan untuk itu. android { testBuildType "staging"}
WIllJBD
5
Saya harus mengajukan laporan bug untuk ini dengan tim Android Studio Tools. Bahkan membangun tipe yang diwarisi dari debugtidak berfungsi kecuali secara eksplisit diatur ke "debug"
Gautham C.
1
wow, saya menggunakan potongan-potongan buildType dengan initWith (buildTypes.debug) dan masih gagal. Hanya dan hanya jika saya menggunakan debug langsung berfungsi!
Karoly
119

Saya membuat kesalahan dengan menempatkan kelas tes di src / test . Setelah memindahkannya ke src / androidTest / java / ketergantungan diselesaikan.

mikrofon
sumber
Dalam kasus saya, folder pengujian saya adalah src / test untuk beberapa alasan, maka saya harus mengganti namanya menjadi src / androidTest dan itu memecahkan masalah saya, setelah 3 jam ...
Teo Inke
69

Baiklah, ini kesalahan Anda dan kesalahan saya!

Jika kita akan menulis sepotong kode untuk Pengujian Unit Lokal kita tidak boleh menggunakan @RunWith(AndroidJUnit4.class)karena kita tidak menggunakan AndroidJUnit4 tetapi kita perlu Junit4. jadi kita harus menulis @RunWith(JUnit4.class). Dan tentu saja file uji java Anda berada di bawah app/src/test/java/your.package.namedirektori.

Kalau tidak (!!) kita ingin menulis beberapa Android Test Unit Unit kita harus meletakkan file java uji kita di app/src/androidTest/java/your.package.namedirektori dan menggunakan anotasi seperti@RunWith(AndroidJUnit4.class)

Sepehr Behroozi
sumber
Saya menggunakan Maven, lalu bagaimana?
JohnyTex
2
@JohnyTex Menggunakan Maven tidak memengaruhi jawaban saya. Itu hanya tergantung pada struktur file proyek Anda.
Sepehr Behroozi
34

Memperbarui

Perpustakaan Tes Android sekarang menjadi bagian dari AndroidX. Pastikan untuk menggunakan dependensi Gradle yang benar yang ditemukan dalam dokumentasi resmi .

Jawaban Asli

Saya menemukan di sini bahwa ada versi yang lebih baru dari Perpustakaan Dukungan Pengujian daripada apa yang saya gunakan:

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

Catatan: Pastikan untuk menggunakan versi terbaru dari perpustakaan ini. Pertanyaan ini dari waktu ketika Pustaka Dukungan Uji Android masih baru dan nomor versi di sini sudah ketinggalan zaman.

Magang-Kode
sumber
3
Saya bertanya-tanya mengapa dokumentasi tidak menyebutkan tentang ini, kecuali saya melewatkannya. Akan menyelamatkan saya dari kesedihan.
Nom1fan
@ Karoly saya masih punya masalah. Apakah Anda menemukan solusi?
Mahdi
26

Saya memecahkan masalah dengan membuat perubahan kecil dalam file build.gradle aplikasi. Di dependencies { ... }bagian ini, pastikan untuk memasukkan baris berikut:

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

atau versi apa pun yang terbaru pada saat itu ( ...Compilesudah usang dan telah digantikan oleh ...Implementation). Perhatikan penggunaan debugImplementation. Android Studio menyarankan agar disertakan secara otomatis androidTestImplementation, yang tidak berfungsi.

Saya menemukan cara mengubahnya dari tes ke debug dengan melihat Struktur Proyek di bawah Dependensi modul aplikasi, di mana Anda dapat mengubah ruang lingkup setiap ketergantungan, lihat di bawah.

Struktur proyek

stemadsen
sumber
Perhatikan bahwa ini akan mengkompilasi pustaka dukungan pengujian ke dalam APK.
Code-Apprentice
Juga bekerja dengan testImplementation "com.android.support.test: rules: 1.0.2"
Prat
10

Perhatikan bahwa OP sekarang dalam 2019, 4 tahun jadi Jika Anda menggunakan Android X maka AndroidJUnit4.classsudah usang, Anda memiliki kesalahan di sana dan satu lagi dengan ini androidx.test.ext.junit.runners.AndroidJUnit4. Saya sarankan untuk membaca tautan ini untuk menyelesaikan masalah.

AndroidJUnit4.class sudah tidak digunakan lagi: Cara menggunakan androidx.test.ext.junit.runners.AndroidJUnit4?

Migrasi tes Junit4 ke androidx: Apa yang menyebabkan 'runner delegasi tidak dapat dimuat'? Bagi saya Android Studio disarankan untuk diganti

@RunWith(AndroidJUnit4.class)

yang sudah tidak digunakan lagi

@RunWith(AndroidJUnit4ClassRunner.class)

dan ini

androidx.test.ext.junit.runners.AndroidJUnit4

dengan ini

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

Setelah itu kesalahan hilang tetapi saya tidak tahu apakah tes di masa depan berjalan ok?!

leonidaa
sumber
@ Code-Apprentice - Terima kasih banyak untuk mengedit, ini jauh lebih baik sekarang
leonidaa
8

Dalam kasus saya ini membantu varian rilis:

android {
    ...
    testBuildType "release" 
}
Andrew Glukhoff
sumber
Bisakah Anda memberikan solusi yang lebih lengkap. Saya tidak mengerti konteks dari apa yang Anda lakukan.
Code-Apprentice
Saya mengalami masalah "Tidak dapat menyelesaikan simbol 'AndroidJUnit4'" pada tes espresso saya ketika saya mengubah varian versi menjadi "rilis". Segera setelah saya menambahkan pernyataan ini (testBuildType "release") ke build.gradle tingkat aplikasi (diambil dari developer.android.com/studio/test/index.html#add_a_new_test ) masalah ini hilang.
Andrew Glukhoff
Saya memformat jawaban Anda kode dalam jawaban Anda. Anda harus menambahkan rincian lebih lanjut, seperti tautan dari komentar Anda dan menjelaskan ke mana blok ini digunakan dalam proyek Anda.
Code-Apprentice
7

Penyebab umum dari masalah ini adalah ketika menambahkan ketergantungan di bawah ini:

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

Ini adalah ketergantungan yang benar jika Anda akan menggunakan tes yang diinstrumentasi (tes dalam androidTestpaket java)

Tetapi untuk mengimplementasikan tes unit lokal (tes dalam testpaket java) saat menggunakan dependensi yang disebutkan di atas; maka Anda akan menghadapiCannot resolve symbol 'AndroidJUnit4'

Itu karena androidTestImplementationdirektif digunakan untuk mengimpor perpustakaan dalam tes instrumen, tetapi tidak dalam tes JVM / unit lokal.

Jika Anda ingin menggunakan AndroidJUnit4dalam uji JVM / unit lokal, maka gunakan dependensi di bawah ini sebagai gantinya

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

Hal yang sama berlaku jika Anda menambahkan ketergantungan yang terakhir saat menggunakan AndroidJUnit4dalam tes instrumen, Anda juga akan mendapatkan Cannot resolve symbol 'AndroidJUnit4'; karena Anda menggunakan arahan yang salah.

Zain
sumber
1
Dalam skenario di pertanyaan awal saya, saya menjalankan tes instrumen. Namun, ini adalah perbedaan besar untuk dibuat dan mudah-mudahan akan membantu pengunjung untuk pertanyaan ini di masa depan.
Code-Apprentice
5

Jika ada yang masih mengalami masalah ini:

Tidak dapat menyelesaikan simbol 'AndroidJUnit4'

dan menggunakan API 27, build.gradleyang ada di modul aplikasi, tambahkan baris berikut:

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
sumber
3

letakkan kode ini di Dependensi Anda

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
sumber
1
Ketika saya menulis pertanyaan ini, saya belum menambahkan espresso sebagai ketergantungan untuk tes unit.
Code-Apprentice
+1 Saya benar-benar mengetahuinya tepat sebelum saya melihat ini, tapi ya, inilah yang saya lakukan dan itu menyelesaikan masalah saya.
Tony D
2
Ikuti dua jawaban di bawah ini dari @sepehr. Kelas AndroidJunit4 tidak ada dalam paket espresso yang hadir dalam paket android.support.test.runner. dan yang harus Anda lakukan adalah memasukkan @Runwith (AndroidJunit4.class) ditulis di atas / untuk test case yang ada di src / Androidtest / java, TERCANTUMAN termasuk dalam kasus uji yang ditulis di bawah src / test / java.
Khay
2

Jika Anda menggunakan proyek dengan beberapa tipe build, maka tipe build yang dipilih di jendela varian build harus disebutkan dengan tag testBuildType dalam file build.gradle modul.

Sebagai contoh: Jika Anda menggunakan build type debug maka Anda harus menambahkan android{testBuildType "debug" }, jika menggunakan stage maka tambahkan android{testBuildType "stage"}pernyataan dalam tag android.

Rahul Rastogi
sumber
Apakah Anda menyarankan untuk mengedit file build jika Anda ingin mengganti varian yang sedang diuji?
nasch
2

Pindahkan kelas tes ke src / androidTest / java /. Maka ketergantungan akan menyelesaikan.

Komal Nikhare
sumber
Lol ... sungguh ...
Manish Kumar Sharma
1

Cache / Restart klasik yang tidak valid telah membantu saya! :)

user_MGU
sumber
1

Tambahkan dependensi ini di file build.gradle Anda:

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

Perbarui versi akhir ( 1.1.1) dengan versi terbaru yang dirilis.

KOUSHIKZEP99
sumber
0

Menambahkan

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

menyelesaikan masalah ini untuk saya.

donlys
sumber
Ini sudah dinyatakan dalam jawaban yang diterima. Anda juga harus melihat apakah ada versi yang lebih baru dan menggunakannya.
Code-Apprentice
Apakah androidTestCompile sama dengan kompilasi?
donlys
compilearahan dependensi nama yang digunakan dalam aplikasi utama sedangkan androidTestComipledependensi nama digunakan untuk pengujian. Jadi jawaban yang benar adalah menggunakan androidTestCompile, bukan compile.
Code-Apprentice
0

Seperti yang ditunjukkan oleh daftar jawaban, ini bisa disebabkan oleh beberapa hal. Satu lagi untuk daftar:

Saya menjalankan LINT yang terlalu bersemangat yang menghapus semua impor yang tidak digunakan. Ini akan menghasilkan kesalahan yang sama, dan mudah untuk melewatkan bahwa ini masalahnya.

Android-studio akan menyoroti referensi yang tidak ada dalam kode uji - dan popup ALT-ENTER akan muncul (ini adalah bit yang mudah dilewatkan).

Selanjutnya, saya harus menghapus tes dari LINT - atau setidaknya menonaktifkan peringatan ini.

Sunting: @ Code-Apprentice, baris yang hilang adalah:

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;

Jadi kesalahan pertama dalam file adalah dengan @RunWith(AndroidJUnit4.class)di awal kelas pengujian saya.

ditangguhkan
sumber
Bisakah Anda menunjukkan contoh tes di mana ini terjadi untuk Anda?
Code-Apprentice
0

Versi Cerpen:

Tingkatkan Gradle Anda ke Versi terbaru

Saya menjawab posting pertanyaan ini pada 15 Februari 2020. Sayangnya, saya telah kehabisan setiap solusi yang mungkin disebutkan di sini dan di tempat lain.

Ya, tidak satu pun di atas yang berfungsi. Saya menggunakan fungsi bawaan, "Migrasikan ke Andoridx", mungkin mengingatkan saya bahwa saya harus memutakhirkan versi SDK target dan versi gradle saya. Setelah saya memutakhirkan versi gradle saya dari 2.0.2 ke 3.5.3. Mereka hanya berfungsi, bahkan pernyataan impor yang lama berfungsi.

Bryan Zhang
sumber
Hai, ini adalah pertanyaan lama yang sudah memiliki jawaban yang diterima dan saya gagal melihat bagaimana jawaban Anda menambahkan sesuatu yang baru untuk pertanyaan itu. Harap hindari menjawab jika jawaban Anda tidak menambahkan sesuatu yang baru ke jawaban yang ada. Terima kasih
hippozhipos
Jawaban yang diterima memberikan tautan untuk memperbarui dependensi pengujian ke pustaka Pengujian AndroidX. Ini mungkin hal yang memperbaikinya dalam semua hal yang Anda coba.
Code-Apprentice
0

Kesalahan yang sama terjadi pada saya ketika saya mengikuti aplikasi Google IOSched dan mengatur proyek saya dengan tiga tipe build [debug, rilis, pementasan] di mana debug dan rilis berbagi direktori sumber yang sama

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

Dalam hal ini, tentukan testBuildTypefile build.gradle di tingkat modul Anda dan proyek sekarang seharusnya dapat menyelesaikan simbol 'AndroidJUnit4'.

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

testBuildType "staging"
...

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

Jie Heng
sumber