ไม่สามารถแก้ไขสัญลักษณ์ 'AndroidJUnit4'


139

เห็นได้ชัดว่าฉันต้องการสถานะการนำเข้าที่ถูกต้องเพื่อแก้ไขปัญหานี้ ตามเอกสารสำหรับAndroidJUnit4นี้ควรจะเป็น

import android.support.test.runner.AndroidJUnit4;

เมื่อฉันทำเช่นนั้น Android Studio จะเน้นrunnerสีแดงและบ่นว่า "ไม่สามารถแก้ไขสัญลักษณ์ 'นักวิ่ง' ได้

พื้นหลัง

ผมได้มาถึงจุดนี้ได้โดยทำตามบทเรียนบนเว็บไซต์นักพัฒนาซอฟต์แวร์ Android สำหรับการตั้งค่าการทดสอบโดยใช้ UI อัตโนมัติ ปัญหาที่ผมเจอเป็นครั้งแรกคือการที่com.android.support:support-v4:22.2.0และขึ้นอยู่กับรุ่นที่แตกต่างกันของcom.android.support.test:runner:0.2 com.android.support:support-annotationsฉันทำตามคำแนะนำจากรายงานบั๊ก Android นี้และเพิ่มสิ่งต่อไปนี้allprojectsในโครงการของฉันbuild.gradle:

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

วิธีนี้แก้ไขข้อผิดพลาดได้ทันที แต่ฉันคิดว่ามันจะนำไปสู่ปัญหาในปัจจุบันของฉัน ใครบ้างมีคำแนะนำเกี่ยวกับวิธีการแก้ไขนี้

ส่วนที่เกี่ยวข้องจาก `./gradlew: แอพ: การอ้างอิง

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

นั่นแสดงว่างานสร้างของคุณขาดหายไปcom.android.support.test:runnerทันที คุณสามารถยืนยันผ่านทางgradle dependenciesที่คุณยังคงดึงสิ่งนี้หลังจากการresolutionStrategyเปลี่ยนแปลงหรือไม่
CommonsWare

@CommonsWare เพิ่มการอ้างอิงที่ส่งออกไปยังคำถามของฉัน ฉันไม่รู้(*)ว่าหลังจากcom.android.support.test:runner:0.2นั้น
Code-Apprentice

ตามที่ Gradle folksเครื่องหมายดอกจัน "หมายความว่ามุมมองแบบต้นไม้ของกราฟการพึ่งพานั้นถูกตัดให้สั้นลง ณ จุดนี้เนื่องจากส่วนของกราฟนั้นมีการระบุไว้ก่อนหน้านี้แล้ว" ฉันนิ่งงันว่าทำไมสิ่งนี้ถึงไม่ได้ผลสำหรับคุณ
CommonsWare

1
โปรดทราบว่าคำตอบของ @stemadsen จากปี 2018 อาจมีความเกี่ยวข้องมากกว่าคำตอบอื่น ๆ มีคนเคยเขียนเกี่ยวกับการทดสอบที่เก็บคำถามในปีเดียวกันหลังจากปี แต่คำตอบที่มีการเปลี่ยนแปลง ...
รอย Falk

คำตอบ:


199

ตรวจสอบให้แน่ใจว่าแอปของคุณอยู่ในชุดการสร้างดีบั๊ก ไปที่Build> เลือก Build Variant ...และสิ่งต่อไปนี้ควรปรากฏขึ้น:

ป้อนคำอธิบายรูปภาพที่นี่


5
ขอบคุณคุณช่วยฉันด้วย
โซฟา

10
อวยพรคุณ เอกสารไม่เคยระบุว่า "สิ่งนี้จะทำงานในการแก้ปัญหาเท่านั้น" น่าผิดหวังมาก
Chantell Osejo

27
ว้าว. ขึ้นโหวต x 1 ล้าน นี่คือคำตอบที่ฉันค้นหามาหลายวันแล้ว พบสิ่งนี้ด้วยเพื่อให้คุณสามารถเปลี่ยนประเภทบิลด์ที่จะใช้ android { testBuildType "staging"}
WIllJBD

5
ฉันจะต้องยื่นรายงานข้อผิดพลาดสำหรับสิ่งนี้กับทีมงาน Android Studio Tools แม้กระทั่งการสร้างประเภทที่สืบทอดจากdebugไม่ทำงานเว้นแต่ตั้งค่าเป็น "ดีบั๊ก" อย่างชัดเจน
Gautham C.

1
ว้าวฉันกำลังใช้ cutom buildType กับ initWith (buildTypes.debug) และยังคงล้มเหลว เฉพาะในกรณีที่ฉันใช้ดีบักได้ผลโดยตรง!
Karoly

120

ฉันทำผิดพลาดที่จะนำการเรียนการทดสอบที่src / test หลังจากย้ายไปยังsrc / androidTest / java /การพึ่งพาได้รับการแก้ไข


ในกรณีของฉันโฟลเดอร์ทดสอบของฉันคือ src / test ด้วยเหตุผลบางอย่างจากนั้นฉันต้องเปลี่ยนชื่อเป็น src / androidTest และแก้ไขปัญหาของฉันหลังจาก 3 ชั่วโมง ...
Teo Inke

69

ตกลงดังนั้นนี่คือความผิดพลาดของคุณและของฉัน!

หากเรากำลังจะเขียนโค้ดสำหรับการทดสอบหน่วยท้องถิ่นเราไม่ควรใช้@RunWith(AndroidJUnit4.class)เพราะเราไม่ได้ใช้ AndroidJUnit4 แต่เราต้องการ Junit4 @RunWith(JUnit4.class)ดังนั้นเราควรจะเขียน และแน่นอนไฟล์ทดสอบ java ของคุณอยู่ภายใต้app/src/test/java/your.package.nameไดเรกทอรี

ถ้า (!!) เราต้องการเขียนทดสอบอุปกรณ์ Androidเราควรใส่ไฟล์ java ทดสอบของเราในapp/src/androidTest/java/your.package.nameไดเรกทอรีและใช้คำอธิบายประกอบเช่น@RunWith(AndroidJUnit4.class)


ฉันใช้ Maven แล้วจะเป็นอย่างไร?
JohnyTex

2
@JohnyTex การใช้ Maven ไม่มีผลกับคำตอบของฉัน ขึ้นอยู่กับโครงสร้างไฟล์โครงการของคุณ
Sepehr Behroozi

34

ปรับปรุง

ห้องสมุดทดสอบ Android ตอนนี้เป็นส่วนหนึ่งของ AndroidX ให้แน่ใจว่าจะใช้การอ้างอิงที่ถูกต้อง Gradle พบในเอกสารอย่างเป็นทางการ

คำตอบเดิม

ฉันพบที่นี่ว่ามี Library สนับสนุนการทดสอบเวอร์ชันใหม่กว่าที่ฉันใช้อยู่:

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

หมายเหตุ: อย่าลืมใช้ไลบรารี่เหล่านี้เวอร์ชันล่าสุด คำถามนี้มาจากช่วงเวลาที่ห้องสมุดสนับสนุนการทดสอบ Android เป็นรุ่นใหม่และหมายเลขรุ่นที่นี่ล้าสมัยมาก


3
ฉันสงสัยว่าทำไม เอกสารถึงไม่มีอะไรเกี่ยวกับเรื่องนี้จนกว่าฉันจะพลาด คงจะช่วยให้ฉันเศร้าโศกบ้างไหม
Nom1fan

@ Karoly ฉันยังคงมีปัญหา คุณพบทางออกหรือไม่?
มาห์ดี

26

ฉันแก้ไขปัญหาโดยทำการเปลี่ยนแปลงเล็กน้อยในไฟล์ build.gradle ของแอป ในdependencies { ... }ส่วนตรวจสอบให้แน่ใจว่าได้รวมบรรทัดต่อไปนี้:

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

หรือเวอร์ชันใดก็ตามที่เป็นรุ่นล่าสุด ณ จุดนั้น ( ...Compileเลิกใช้แล้วและถูกแทนที่ด้วย...Implementation) หมายเหตุdebugImplementationการใช้งานของ Android Studio แนะนำให้ใส่อัตโนมัติandroidTestImplementationซึ่งไม่ได้ผล

ฉันค้นพบวิธีเปลี่ยนจากการทดสอบเป็นการดีบั๊กโดยดูในโครงสร้างโครงการภายใต้การพึ่งพาของโมดูลแอปที่คุณสามารถเปลี่ยนขอบเขตของการพึ่งพาแต่ละรายการดูด้านล่าง

โครงสร้างโครงการ


โปรดทราบว่านี่จะรวบรวมห้องสมุดสนับสนุนการทดสอบลงใน APK
Code-Apprentice

ทำงานร่วมกับ testImplementation "com.android.support.test: กฎ: 1.0.2"
Prat

10

ขอให้สังเกตว่านี้ OP ขณะนี้อยู่ใน 2019 ดังนั้น 4 ปีถ้าคุณกำลังใช้ Android X แล้วจะเลิกคุณมีข้อผิดพลาดและมีอีกหนึ่งกับเรื่องนี้AndroidJUnit4.class androidx.test.ext.junit.runners.AndroidJUnit4ฉันแนะนำให้อ่านลิงค์นี้เพื่อแก้ปัญหา

AndroidJUnit4.class เลิกใช้แล้ว: วิธีใช้ androidx.test.ext.junit.runners.AndroidJUnit4?

การโอนย้ายการทดสอบ Junit4 ไปยัง androidx: อะไรคือสาเหตุ 'ไม่สามารถโหลดนักวิ่งที่มอบหมาย' สำหรับฉัน Android Studio แนะนำให้เปลี่ยน

@RunWith(AndroidJUnit4.class)

ซึ่งเลิกใช้แล้ว

@RunWith(AndroidJUnit4ClassRunner.class)

และนี่

androidx.test.ext.junit.runners.AndroidJUnit4

ด้วยสิ่งนี้

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

หลังจากนั้นข้อผิดพลาดจะหายไป แต่ฉันไม่ทราบว่าการทดสอบในอนาคตในขณะที่ทำงาน ok?!


@ Code-Apprentice - ขอบคุณมากสำหรับการแก้ไขมันดีกว่ามากตอนนี้
leonidaa

8

ในกรณีของฉันสิ่งนี้ช่วยในการเผยแพร่ชุดตัวเลือก:

android {
    ...
    testBuildType "release" 
}

คุณช่วยแก้ปัญหาที่สมบูรณ์กว่านี้ได้ไหม ฉันไม่เข้าใจบริบทของสิ่งที่คุณทำ
รหัส - ผู้ฝึกงาน

ฉันพบ "ไม่สามารถแก้ปัญหาสัญลักษณ์ 'AndroidJUnit4'" ในการทดสอบเอสเปรสโซ่ของฉันเมื่อฉันเปลี่ยนชุดการสร้างเป็น "ปล่อย" ทันทีที่ฉันเพิ่มคำสั่งนี้ (testBuildType "release") ลงในระดับแอป build.gradle (นำมาจากdeveloper.android.com/studio/test/index.html#add_a_new_test ) ปัญหานี้หายไป
Andrew Glukhoff

ฉันจัดรูปแบบคำตอบของคุณรหัสในคำตอบของคุณ คุณควรเพิ่มรายละเอียดเพิ่มเติมเช่นลิงค์จากความคิดเห็นของคุณและอธิบายว่าบล็อกนี้ไปที่ใดในโครงการของคุณ
รหัสผู้ฝึกงาน

7

สาเหตุทั่วไปของปัญหานี้คือเมื่อเพิ่มการพึ่งพาด้านล่าง:

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

นี่คือการพึ่งพาที่ถูกต้องหากคุณจะใช้การทดสอบแบบใช้เครื่องมือ (การทดสอบใน androidTestแพ็คเกจ Java)

แต่สำหรับการใช้การทดสอบหน่วยท้องถิ่น (การทดสอบในtestแพคเกจจาวา) ในขณะที่ใช้การพึ่งพาดังกล่าวข้างต้น แล้วคุณจะต้องเผชิญCannot resolve symbol 'AndroidJUnit4'

นั่นเป็นเพราะandroidTestImplementationคำสั่งใช้เพื่อนำเข้าไลบรารีในการทดสอบแบบใช้เครื่องมือ แต่ไม่ได้อยู่ในการทดสอบ JVM / หน่วยในท้องถิ่น

หากคุณต้องการใช้AndroidJUnit4ในการทดสอบ JVM ท้องถิ่น / หน่วยให้ใช้การพึ่งพาด้านล่างแทน

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

สิ่งเดียวกันนี้ถ้าคุณเพิ่มการพึ่งพาหลังในขณะที่ใช้AndroidJUnit4ในการทดสอบแบบใช้เครื่องมือคุณจะได้รับCannot resolve symbol 'AndroidJUnit4'เช่นกัน เพราะคุณใช้คำสั่งที่ผิด


1
ในสถานการณ์ในคำถามเดิมของฉันฉันใช้การทดสอบแบบใช้เครื่องมือ อย่างไรก็ตามนี่คือความแตกต่างที่ดีในการทำและหวังว่าจะช่วยให้ผู้เข้าชมคำถามนี้ในอนาคต
Code-Apprentice

5

หากใครยังมีปัญหานี้:

ไม่สามารถแก้ไขสัญลักษณ์ 'AndroidJUnit4'

และใช้ API 27 build.gradleซึ่งอยู่ในโมดูลแอพเพิ่มบรรทัดต่อไปนี้:

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

ใส่รหัสนี้ในการอ้างอิงของคุณ

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
เมื่อฉันเขียนคำถามนี้ฉันยังไม่ได้เพิ่มเอสเพรสโซ่เพื่อการทดสอบหน่วย
รหัสผู้ฝึกงาน

+1 ฉันคิดจริงก่อนที่จะเห็นสิ่งนี้ แต่ใช่นี่คือสิ่งที่ฉันทำและแก้ไขปัญหาของฉันได้
Tony D

2
ทำตามสองคำตอบด้านล่างจาก @sepehr คลาส AndroidJunit4 ไม่ได้อยู่ในแพ็คเกจเอสเปรสโซติดตั้งอยู่ในแพ็คเกจ android.support.test.runner และสิ่งที่คุณต้องทำคือรวม @Runwith (AndroidJunit4.class) เขียนไว้ข้างบน / สำหรับกรณีทดสอบที่แสดงอยู่ใน src / Androidtest / java, INSTED OF รวมถึงในกรณีทดสอบที่เขียนภายใต้ src / test / java
Khay

2

หากคุณกำลังใช้โปรเจ็กต์ที่มีชนิดบิลด์หลายประเภทจะต้องพูดถึงประเภทบิลด์ที่เลือกในหน้าต่างบิลด์ย่อยด้วยแท็ก testBuildType ในไฟล์ build.gradle ของโมดูล

ตัวอย่างเช่น: หากคุณกำลังใช้ดีบักชนิดบิลด์คุณควรเพิ่มandroid{testBuildType "debug" }ถ้าใช้สเตจแล้วเพิ่มandroid{testBuildType "stage"}คำสั่งในแท็ก Android


คุณแนะนำให้แก้ไขไฟล์บิลด์หรือไม่หากคุณต้องการเปลี่ยนตัวแปรที่จะทดสอบ?
nasch



1

เพิ่มการพึ่งพานี้ในไฟล์ build.gradle ของคุณ:

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

อัปเดตเวอร์ชั่นสุดท้าย ( 1.1.1) ด้วยเวอร์ชั่นล่าสุดที่วางจำหน่าย


0

เพิ่ม

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

แก้ไขปัญหาที่แน่นอนนี้สำหรับฉัน


นี่เป็นคำตอบที่ยอมรับแล้ว คุณควรดูว่ามีรุ่นที่ใหม่กว่าหรือไม่และใช้งานแทน
Code-Apprentice

androidTestCompile เหมือนกับคอมไพล์หรือไม่?
donlys

compileการอ้างอิงชื่อคำสั่งที่ใช้ในแอปหลักขณะที่การandroidTestComipleอ้างอิงชื่อใช้สำหรับการทดสอบ ดังนั้นคำตอบที่ถูกต้องคือการใช้ไม่ได้androidTestCompile compile
รหัสฝึกหัด

0

เมื่อรายการคำตอบแสดงให้เห็นสิ่งนี้อาจเกิดจากบางสิ่ง อีกหนึ่งรายการ:

ฉันใช้ Lint ที่กระตือรือร้นมากซึ่งลบการนำเข้าที่ไม่ได้ใช้ทั้งหมดออก สิ่งนี้จะสร้างข้อผิดพลาดเดียวกันและพลาดง่าย ๆ ว่านี่คือปัญหา

Android-studio จะเน้นการอ้างอิงที่ขาดหายไปในรหัสทดสอบ - และป๊อปอัพ ALT-ENTER จะปรากฏขึ้น (นี่เป็นบิตที่พลาดง่าย)

ต่อไปฉันต้องลบการทดสอบออกจาก LINT หรืออย่างน้อยก็ปิดการใช้งานคำเตือนนี้

แก้ไข: @ Code-Apprentice บรรทัดที่ขาดหายไปคือ:

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;

ดังนั้นข้อผิดพลาดแรกในไฟล์คือ@RunWith(AndroidJUnit4.class)เมื่อเริ่มต้นการทดสอบ


คุณสามารถแสดงตัวอย่างการทดสอบที่เกิดขึ้นกับคุณได้ไหม
Code-Apprentice

0

เวอร์ชั่นสั้น

อัพเกรด Gradle ของคุณเป็นเวอร์ชั่นล่าสุด

ฉันกำลังตอบโพสต์คำถามนี้เมื่อวันที่ 15 กุมภาพันธ์ 2020 แต่น่าเสียดายที่ฉันได้ใช้วิธีแก้ปัญหาที่เป็นไปได้ทั้งหมดที่กล่าวถึงที่นี่และที่อื่น ๆ

ใช่ไม่มีใครทำงานได้เลย ฉันใช้ฟังก์ชั่นในตัว "โยกย้ายไปยัง Andoridx" มันอาจเตือนฉันว่าฉันต้องอัพเกรดเวอร์ชั่น SDK เป้าหมายและเวอร์ชันตัวต่อของฉัน หลังจากฉันอัพเกรดเวอร์ชั่น gradle จาก 2.0.2 เป็น 3.5.3 พวกเขาใช้งานได้แม้คำสั่งการนำเข้าเก่าจะใช้งานได้


สวัสดีนี่เป็นคำถามเก่าที่มีคำตอบที่ยอมรับแล้วและฉันไม่สามารถดูว่าคำตอบของคุณเพิ่มอะไรใหม่ให้กับคำถาม โปรดหลีกเลี่ยงการตอบถ้าคำตอบของคุณไม่ได้เพิ่มอะไรใหม่ในคำตอบที่มีอยู่ ขอบคุณ
hippozhipos

คำตอบที่ได้รับการยอมรับมีลิงก์เพื่ออัปเดตการอ้างอิงการทดสอบไปยังไลบรารีการทดสอบ AndroidX นี่เป็นสิ่งที่แก้ไขได้ในทุกสิ่งที่คุณลอง
รหัส - ผู้ฝึกงาน

0

ข้อผิดพลาดเดียวกันเกิดขึ้นกับฉันเมื่อฉันติดตามแอป Google IOSched และตั้งค่าโครงการของฉันด้วยบิลด์สามประเภท [debug, release, staging] โดยที่ debug และ release ใช้ไดเรกทอรีแหล่งเดียวกัน

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

ในกรณีนี้ระบุtestBuildTypeไฟล์ build.gradle ในระดับโมดูลของคุณและโครงการควรจะสามารถแก้ไขสัญลักษณ์ 'AndroidJUnit4' ได้

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

testBuildType "staging"
...

การอ้างอิง: https://github.com/google/iosched/blob/master/mobile/build.gradle

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.