'AndroidJUnit4' प्रतीक को हल नहीं कर सकता


139

जाहिर है मुझे इस समस्या को हल करने के लिए सही आयात क़ानून की आवश्यकता है। डॉक्स केAndroidJUnit4 अनुसार , यह होना चाहिए

import android.support.test.runner.AndroidJUnit4;

जब मैं ऐसा करता हूं, तो एंड्रॉइड स्टूडियो runnerलाल रंग में हाइलाइट करता है और शिकायत करता है कि "प्रतीक 'धावक को हल नहीं कर सकता"।

पृष्ठभूमि

मुझे यूआई ऑटोमेटर का उपयोग करके परीक्षण स्थापित करने के लिए एंड्रॉइड डेवलपर साइट पर ट्यूटोरियल का पालन करके इस बिंदु पर मिला । मुझे जो पहली समस्या आई वह थी 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 मेरे सवाल में निर्भरता उत्पादन जोड़ा गया। मुझे नहीं पता कि इसके (*)बाद क्या मतलब है com.android.support.test:runner:0.2
कोड-अपरेंटिस

ग्रैडल लोगों के अनुसार , तारांकन "का अर्थ है कि इस बिंदु पर निर्भरता ग्राफ के पेड़ के दृश्य को छोटा काट दिया जाता है क्योंकि ग्राफ़ का वह हिस्सा पहले ही सूचीबद्ध था।" मैं इस बात पर अडिग हूं कि यह आपके लिए काम क्यों नहीं कर रहा है।
कॉमंसवेयर

1
ध्यान दें कि 2018 से @stemadsen का उत्तर संभवतः दूसरों की तुलना में अधिक प्रासंगिक है। किसी ने एक बार एक परीक्षा के बारे में लिखा था, जो साल-दर-साल उसी सवाल को रखता था, लेकिन जवाब बदल गए ...
रॉय फॉक

जवाबों:


199

सुनिश्चित करें कि आपका ऐप डिबग बिल्ड वैरिएंट में है। पर जाएं संस्करण बिल्ड> चुनें बिल्ड ... और निम्न दिखाई देना चाहिए:

यहां छवि विवरण दर्ज करें


5
धन्यवाद, आपने मुझे बचाया
सोफा

10
तुम्हें आशीर्वाद देते हैं। प्रलेखन कभी नहीं बताता है "यह सामान केवल डिबग में काम करेगा"। कितना निराशाजनक।
चेंटेल ओस्जो

27
वाह। अप-वोट x 1 मिलियन। यह वह उत्तर है जो मैं दिनों से खोज रहा हूं। यह भी पाया ताकि आप बदल सकते हैं जो इसके लिए उपयोग करने के लिए प्रकार का निर्माण करते हैं। android { testBuildType "staging"}
WIJJBD

5
मैं इसके लिए Android Studio Tools टीम के साथ एक बग रिपोर्ट दर्ज करने जा रहा हूं। यहां तक ​​कि उन प्रकारों का निर्माण करें जो debugतब तक काम नहीं करते हैं जब तक कि स्पष्ट रूप से "डिबग" पर सेट नहीं किया जाता है
गौतम सी।

1
वाह, मैं initWith (buildTypes.debug) के साथ एक cutom buildType का उपयोग कर रहा हूं और अभी भी विफल रहता है। केवल और केवल अगर मैं डिबग का उपयोग कर रहा हूं तो सीधे काम करता है!
कारोली

120

मैंने परीक्षा कक्षाओं को src / test में डालने की गलती की । उन्हें src / androidTest / java / पर जाने के बाद निर्भरता हल हो गई थी।


मेरे मामले में मेरा परीक्षण फ़ोल्डर किसी कारण से src / test था, तो मुझे इसे src / androidTest का नाम बदलना पड़ा और इसने मेरी समस्या को हल कर दिया, 3 घंटे बाद ...
Teo Inke

69

ठीक है तो यहाँ तुम्हारी गलती है और मेरा है!

अगर हम लोकल यूनिट टेस्टिंग के लिए कोड का एक पेसा लिखने जा रहे हैं @RunWith(AndroidJUnit4.class)तो हमें उस कारण का उपयोग नहीं करना चाहिए जिसका हम AndroidJUnit4 का उपयोग नहीं करते हैं, लेकिन हमें Junit4 की आवश्यकता है। इसलिए हमें लिखना चाहिए @RunWith(JUnit4.class)। और निश्चित रूप से आपकी जावा परीक्षण फ़ाइल app/src/test/java/your.package.nameनिर्देशिका के अंतर्गत है ।

और अगर (!!) हम कुछ एंड्रॉइड इंस्ट्रूमेंटेड यूनिट टेस्ट लिखना चाहते हैं तो हमें अपनी टेस्ट जावा फाइलों को app/src/androidTest/java/your.package.nameडायरेक्टरी में रखना चाहिए और जैसे एनोटेशन का उपयोग करना चाहिए@RunWith(AndroidJUnit4.class)


मैं मावेन का उपयोग कर रहा हूं, फिर क्या?
जॉनीटेक्स

2
@JohnyTex मावेन का उपयोग करने से मेरा उत्तर प्रभावित नहीं होता है। यह केवल आपकी परियोजना फ़ाइल संरचना पर निर्भर करता है।
सिपहर बेहारोजी

34

अपडेट करें

Android टेस्ट लाइब्रेरी अब AndroidX का हिस्सा है। आधिकारिक दस्तावेज में पाए गए सही ग्रेडल निर्भरता का उपयोग करना सुनिश्चित करें ।

मूल उत्तर

मैंने पाया यहाँ मैं क्या का उपयोग कर रहा था की तुलना में परीक्षण समर्थन लाइब्रेरी के नए संस्करण देखते हैं कि:

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

नोट: इन पुस्तकालयों के सबसे हाल के संस्करणों का उपयोग करना सुनिश्चित करें। यह प्रश्न उस समय से है जब एंड्रॉइड टेस्ट सपोर्ट लाइब्रेरी नई थी और यहां संस्करण संख्या बहुत पुरानी है।


3
मुझे आश्चर्य है कि दस्तावेज़ीकरण में इस बारे में कुछ भी उल्लेख नहीं किया गया है, जब तक कि मैं इसे याद नहीं करता। मुझे कुछ दुःख से बचाया होगा।
नोम

@Karoly मुझे अभी भी समस्या है। क्या आपको कोई समाधान मिला?
महदी

26

मैंने ऐप की बिल्ड.ग्रेड फ़ाइल में एक छोटा सा बदलाव करके समस्या का हल किया। में dependencies { ... }अनुभाग, निम्न पंक्ति शामिल करना सुनिश्चित करें:

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

या जो भी संस्करण उस बिंदु पर सबसे नया है ( ...Compileपदावनत है और उसे बदल दिया गया है ...Implementation)। के उपयोग पर ध्यान देंdebugImplementation । एंड्रॉइड स्टूडियो ने इसके साथ ऑटो-सहित का सुझाव दिया androidTestImplementation, जो काम नहीं किया।

मुझे पता चला कि ऐप मॉड्यूल की निर्भरता के तहत प्रोजेक्ट स्ट्रक्चर में देखकर इसे टेस्ट से डिबग में कैसे बदला जाए, जहां आप प्रत्येक निर्भरता के दायरे को बदल सकते हैं, नीचे देखें।

परियोजना की संरचना


ध्यान दें कि यह परीक्षण सहायता लाइब्रेरी को एपीके में संकलित करेगा।
कोड-अपरेंटिस

इसके अलावा साथ testImplementation काम करता है "1.0.2: नियम com.android.support.test"
प्रात

10

ध्यान दें कि यह ओपी अब 2019 में है, 4 साल पुराना है इसलिए यदि आप एंड्रॉइड एक्स का उपयोग कर रहे हैं तो AndroidJUnit4.classपदावनत किया जाता है, आपको वहां एक त्रुटि है और इसके साथ एक और androidx.test.ext.junit.runners.AndroidJUnit4। मैं समस्या को हल करने के लिए इस लिंक को पढ़ने का सुझाव देता हूं।

AndroidJUnit4.class को हटा दिया गया है: Androidx.test.ext.junit.runners.AndroidJUnit4 का उपयोग कैसे करें?

Androidx के लिए Junit4 परीक्षणों को माइग्रेट करना: किन कारणों से 'प्रतिनिधि धावक लोड नहीं किया जा सका'? मेरे लिए Android Studio ने प्रतिस्थापित करने का सुझाव दिया

@RunWith(AndroidJUnit4.class)

जिसके साथ पदावनत किया गया था

@RunWith(AndroidJUnit4ClassRunner.class)

और इस

androidx.test.ext.junit.runners.AndroidJUnit4

इसके साथ

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

उसके बाद त्रुटि हो गई है, लेकिन मुझे नहीं पता कि भविष्य की परीक्षा ठीक है या नहीं?


@ कोड-अपरेंटिस - संपादन के लिए बहुत बहुत धन्यवाद, अभी बहुत अच्छा है
लियोनिडा

8

मेरे मामले में यह रिलीज़ संस्करण के लिए मदद करता है:

android {
    ...
    testBuildType "release" 
}

क्या आप अधिक पूर्ण समाधान दे सकते हैं। मुझे समझ नहीं आया कि आपने क्या किया।
कोड-अपरेंटिस

जब मैंने "रिलीज़" के संस्करण का निर्माण किया तो मैंने अपने एस्प्रेसो परीक्षण पर प्रतीक 'AndroidJUnit4' को जारी नहीं किया। जैसे ही मैंने इस स्टेटमेंट (testBuildType "रिलीज़") को ऐप-लेवल build.gradle ( डेवलपर से लिया गया है, डेवलपर_android.com/studio/test/index.html#add_a_new_test) पर जोड़ा जैसे ही यह मुद्दा गायब हो गया।
एंड्रयू ग्लुकॉफ

मैंने आपके उत्तर को आपके उत्तर में कोड स्वरूपित किया। आपको अधिक विवरण जोड़ना चाहिए, जैसे कि आपकी टिप्पणी से लिंक और वर्णन करें कि यह ब्लॉक आपकी परियोजना में कहां जाता है।
कोड-अपरेंटिस

7

इस समस्या का सामान्य कारण यह है कि नीचे निर्भरता को जोड़ने पर:

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

यह एक सही निर्भरता है यदि आप साधन परीक्षण ( androidTestजावा पैकेज में परीक्षण ) का उपयोग करने जा रहे हैं

लेकिन testउपर्युक्त निर्भरता का उपयोग करते समय स्थानीय इकाई परीक्षणों ( जावा पैकेज में परीक्षण ) को लागू करने के लिए ; तो आप सामना करेंगेCannot resolve symbol 'AndroidJUnit4'

ऐसा इसलिए है क्योंकि androidTestImplementationनिर्देश का उपयोग इंस्ट्रूमेंटेड परीक्षणों में पुस्तकालयों को आयात करने के लिए किया जाता है, लेकिन स्थानीय जेवीएम / यूनिट परीक्षणों में नहीं।

यदि आप AndroidJUnit4स्थानीय जेवीएम / यूनिट परीक्षण में उपयोग करना चाहते हैं , तो इसके बजाय नीचे निर्भरता का उपयोग करें

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

यही बात लागू होती है यदि आप AndroidJUnit4इंस्ट्रूमेंटेड टेस्ट में उपयोग करते समय बाद की निर्भरता को जोड़ते हैं , तो आपको भी मिलेगा Cannot resolve symbol 'AndroidJUnit4'; क्योंकि आप गलत निर्देश का उपयोग कर रहे हैं।


1
मेरे मूल प्रश्न के परिदृश्य में, मैं साधन परीक्षण चला रहा था। हालांकि, यह बनाने के लिए एक महान अंतर है और उम्मीद है कि आने वाले समय में आगंतुकों को इस सवाल पर मदद मिलेगी।
कोड-अपरेंटिस

5

अगर किसी को अभी भी यह समस्या है:

'AndroidJUnit4' प्रतीक को हल नहीं कर सकता

और एपीआई 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 मैंने वास्तव में इसे देखने से पहले ही इसका पता लगा लिया था, लेकिन हां, मैंने यही किया और इसने मेरी समस्या हल कर दी।
टोनी डी

2
नीचे दिए गए दो उत्तरों का अनुसरण करें @sepehr से। AndroidJunit4 वर्ग एस्प्रेसो पैकेज में नहीं है, जो Android.support.test.runner पैकेज में मौजूद है। और आपको बस इतना करना है कि इसमें @Runwith (AndroidJunit4.class) शामिल है जो src / Androidtest / java में मौजूद टेस्ट केस के लिए ऊपर / में लिखा गया है, SST / टेस्ट / जावा के तहत लिखे गए टेस्ट मामलों में शामिल है।
खाय

2

यदि आप कई बिल्ड-प्रकार के साथ प्रोजेक्ट का उपयोग कर रहे हैं, तो बिल्ड-वेरिएंट विंडो में चयनित बिल्ड-प्रकार का उल्लेख मॉड्यूल के build.gradle फ़ाइल में testBuildType टैग के साथ किया जाना चाहिए।

उदाहरण के लिए: यदि आप बिल्ड प्रकार डीबग का उपयोग कर रहे हैं तो आपको जोड़ना चाहिए android{testBuildType "debug" }, यदि चरण का उपयोग कर रहे हैं तो android{testBuildType "stage"}एंड्रॉइड टैग में स्टेटमेंट जोड़ें ।


क्या आप बिल्ड फ़ाइल को संपादित करने का सुझाव दे रहे हैं यदि आप परीक्षण किए जा रहे संस्करण को स्विच करना चाहते हैं?
nasch


1

शास्त्रीय अमान्य कैश / पुनरारंभ ने मेरी मदद की है! :)


1

इस निर्भरता को अपनी build.gradle फ़ाइल में जोड़ें:

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

1.1.1जारी नवीनतम संस्करण के साथ अंत संस्करण ( ) को अपडेट करें ।


0

जोड़ा जा रहा है

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

मेरे लिए इस सटीक मुद्दे को हल किया।


यह पहले से ही स्वीकृत उत्तर में कहा गया है। आपको यह भी देखना चाहिए कि क्या अधिक हाल का संस्करण है और इसके बजाय इसका उपयोग करें।
कोड-अपरेंटिस

क्या AndroidTestCompile संकलन के समान है?
20

compileमुख्य ऐप में उपयोग की जाने वाली androidTestComipleनाम निर्भरताएं, जबकि परीक्षण के लिए उपयोग की जाने वाली निर्भरताएँ। तो सही उत्तर का उपयोग करना है androidTestCompile, नहीं compile
कोड-अपरेंटिस

0

जैसा कि उत्तरों की सूची प्रदर्शित करती है, यह कुछ चीजों के कारण हो सकता है। सूची के लिए एक और:

मैंने एक अति उत्साही LINT चलाया, जिसने सभी अप्रयुक्त आयातों को हटा दिया। यह समान त्रुटियों का उत्पादन करेगा, और यह याद रखना आसान है कि यह समस्या है।

एंड्रॉइड-स्टूडियो उन संदर्भों को उजागर करेगा जो परीक्षण कोड में गायब हैं - और ALT-ENTER पॉपअप दिखाई देगा (यह थोड़ा सा है जो याद करना आसान है)।

अगला, मुझे LINT से परीक्षणों को हटाने की आवश्यकता है - या कम से कम इस चेतावनी को अक्षम करें।

संपादित करें: @ कोड-अपरेंटिस, जो लाइनें गायब थीं, वे थीं:

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)मेरे परीक्षण वर्ग की शुरुआत में थी।


क्या आप एक उदाहरण परीक्षण दिखा सकते हैं कि यह आपके लिए कहां हुआ?
कोड-अपरेंटिस

0

लघु कहानी संस्करण:

अपने ग्रेडेल को नवीनतम संस्करण में अपग्रेड करें

मैं 15 फरवरी, 2020 को इस सवाल का जवाब दे रहा हूं। दुर्भाग्य से, मैंने यहां और अन्य जगहों पर उल्लिखित हर संभव समाधानों को समाप्त कर दिया है।

हां, उनमें से कोई भी काम नहीं करता है। मैं बिल्ट-इन फ़ंक्शन का उपयोग करता हूं, "माइग्रेट टू एंडोरिडेक्स", यह मुझे याद दिला सकता है कि मुझे अपने लक्ष्य एसडीके संस्करणों और मेरे ग्रेड संस्करण को अपग्रेड करना है। मैंने 2.0.2 से 3.5.3 तक अपने ग्रेडेल संस्करण को अपग्रेड किया। वे सिर्फ काम करते हैं, यहां तक ​​कि पुराने आयात विवरण भी काम करते हैं।


नमस्ते, यह एक पुराना प्रश्न है जिसका पहले से ही एक स्वीकृत उत्तर है और मैं यह देखने में विफल हूं कि आपका उत्तर प्रश्न में कुछ नया कैसे जोड़ता है। कृपया उत्तर देने से बचें यदि आपका उत्तर मौजूदा उत्तरों में कुछ नया नहीं जोड़ता है। धन्यवाद
hippozhipos

स्वीकृत उत्तर AndroidX परीक्षण पुस्तकालय के लिए परीक्षण निर्भरता को अद्यतन करने के लिए एक लिंक देता है। यह संभावना है कि वह चीज़ है जो आपने कोशिश की सभी चीजों में तय की है।
कोड-अपरेंटिस

0

वही त्रुटि मुझे तब हुई जब मैं Google IOSched app का अनुसरण करता हूं और अपनी परियोजना को तीन बिल्ड प्रकार [डिबग, रिलीज़, स्टेजिंग] के साथ सेट करता हूं, जहां डिबग और रिलीज़ उसी स्रोत निर्देशिका को साझा करते हैं

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.