'AndroidJUnit4'기호를 확인할 수 없습니다


139

분명히이 문제를 해결하려면 올바른 가져 오기 명령문이 필요합니다. 에 대한 문서에AndroidJUnit4 따르면 이것은

import android.support.test.runner.AndroidJUnit4;

그렇게하면 Android Studio runner가 빨간색으로 강조 표시 되고 "기호 '러너'를 확인할 수 없습니다"라고 불평합니다.

배경

UI Automator를 사용하여 테스트설정하기 위해 Android 개발자 사이트의 학습서를 따라이 시점에 도달했습니다 . 발생한 첫 번째 문제의 그 것이었다 com.android.support:support-v4:22.2.0com.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 : 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

즉, 빌드가 com.android.support.test:runner완전히 누락되었음을 나타냅니다 . 변경 gradle dependencies후에도 여전히이 항목을 가져오고 있음을 확인할 수 있습니까 resolutionStrategy?
CommonsWare

@CommonsWare 내 질문에 종속성 출력을 추가했습니다. 나는 그 (*)후의 의미 가 무엇인지 모른다 com.android.support.test:runner:0.2.
코드 견습생

Gradle folks 에 따르면 별표는 "그래프의 해당 부분이 이미 이전에 나열 되었기 때문에 종속성 그래프의 트리 뷰가이 시점에서 짧아졌다"는 것을 의미합니다. 왜 이것이 당신을 위해 작동하지 않는지에 대해 충격을 받았습니다.
CommonsWare

1
@stemadsen의 2018 년 답변은 잠재적으로 다른 사람들보다 관련이 있습니다. 누군가가 한 해에 같은 해에 질문을 유지하는 테스트에 대해 글을 썼지 만 답변이 바뀌 었습니다.
Roy Falk

답변:


199

디버그 빌드 변형에서 앱을 확인하십시오. 빌드> 빌드 변형 선택 ...으로 이동 하면 다음이 표시됩니다.

여기에 이미지 설명을 입력하십시오


5
감사합니다, 당신은 저를 구해 주셨습니다
Sofa

10
축복합니다. 설명서에는 "이 내용은 디버그에서만 작동합니다"라고 나와 있지 않습니다. 너무 실망.
Chantell Osejo 2016 년

27
와. 투표권 x 1 백만. 이것은 내가 며칠 동안 검색 한 답변입니다. 또한 이것을 사용하여 사용할 빌드 유형을 변경할 수 있습니다. android { testBuildType "staging"}
WIllJBD 2016 년

5
Android Studio Tools 팀에 ​​버그 보고서를 제출해야합니다. debug명시 적으로 "디버그"로 설정하지 않으면 상속 유형을 가진 빌드 유형도 작동하지 않습니다
Gautham C.

1
와우, initWith (buildTypes.debug)와 함께 cutsom buildType을 사용하고 있으며 여전히 실패합니다. 디버그를 직접 사용하는 경우에만 작동합니다!
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 Instrumented Unit Test 를 작성하려면 테스트 java 파일을 app/src/androidTest/java/your.package.name디렉토리에 넣고 주석을 사용해야합니다.@RunWith(AndroidJUnit4.class)


나는 Maven을 사용하고 있습니다.
JohnyTex

2
Maven을 사용하는 @JohnyTex는 내 대답에 영향을 미치지 않습니다. 프로젝트 파일 구조에만 의존합니다.
Sepehr Behroozi

34

최신 정보

Android 테스트 라이브러리는 이제 AndroidX의 일부입니다. 공식 문서 에있는 올바른 Gradle 종속성을 사용하십시오 .

원래 답변

여기에서 내가 사용 하는 것보다 최신 버전의 테스팅 지원 라이브러리가 있음을 발견했습니다.

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 여전히 문제가 있습니다. 해결책을 찾았습니까?
Mahdi

26

앱의 build.gradle 파일을 약간 변경하여 문제를 해결했습니다. 에서 dependencies { ... }섹션에서 다음 줄을 포함해야합니다 :

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

또는 그 시점에서 최신 버전이 무엇이든 ( ...Compile더 이상 사용되지 않으며로 대체되었습니다 ...Implementation). 의 사용에 유의 하십시오 debugImplementation. Android Studio에서 자동 포함 제안androidTestImplementation 했지만 작동하지 않았습니다.

각 종속성의 범위를 변경할 수있는 앱 모듈의 종속성 아래에서 프로젝트 구조를 보면 테스트에서 디버그로 변경하는 방법을 알았습니다 (아래 참조).

프로젝트 구조


테스트 지원 라이브러리를 APK로 컴파일합니다.
코드 견습생

또한 testImplementation "com.android.support.test : rules : 1.0.2"와 함께 작동
Prat

10

이 OP는 현재 4 세인 2019 년에 출시되었으므로 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를 실행하는 동안 미래의 테스트인지 모르겠습니다!


코드 - 견습생 @ - 훨씬 지금 좋네요 매우 편집 주셔서 감사합니다
leonidaa가

8

필자의 경우 이것은 릴리스 변형에 도움이되었습니다.

android {
    ...
    testBuildType "release" 
}

보다 완벽한 솔루션을 제공 할 수 있습니까? 당신이 한 일의 맥락을 이해하지 못합니다.
코드 견습생

빌드 변형을 "release"로 변경했을 때 에스프레소 테스트에서 "기호 'AndroidJUnit4'를 해결할 수 없습니다"문제가 발생했습니다. 이 문 (testBuildType "release")을 app-level build.gradle ( developer.android.com/studio/test/index.html#add_a_new_test 에서 가져온 )에 추가 하자마자이 문제는 사라졌습니다.
앤드류 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
원래 질문의 시나리오에서 계측 테스트를 실행했습니다. 그러나 이것은 미래 에이 질문을 방문자에게 알리고 희망적으로 도울 것입니다.
코드 견습생

5

여전히이 문제가있는 사람 :

'AndroidJUnit4'기호를 확인할 수 없습니다

build.gradle앱 모듈 에있는 API 27을 사용 하여 다음 행을 추가하십시오.

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 클래스는 espresso 패키지에 없으며 android.support.test.runner 패키지에 존재합니다. 그리고 당신이해야 할 일은 @Runwith (AndroidJunit4.class)가 위의 / src / Androidtest / java에 존재하는 테스트 케이스에 기록되어 있으며 src / test / java로 작성된 테스트 케이스를 포함하여 INSTED OF에 포함되어 있다는 것입니다.
Khay

2

여러 빌드 유형의 프로젝트를 사용하는 경우 빌드 변형 창에서 선택한 빌드 유형은 모듈의 build.gradle 파일에서 testBuildType 태그로 언급해야합니다.

예를 들어 : 빌드 유형 디버그android{testBuildType "debug" }사용하는 경우 stage 를 사용하는 경우 android{testBuildType "stage"}android 태그 에 문 을 추가 해야합니다 .


테스트중인 변형을 전환하려면 빌드 파일을 편집 할 것을 제안합니까?
nasch


1

고전적인 Invalidate Caches / Restart 가 도움이되었습니다! :)


1

build.gradle 파일에서이 종속성을 추가하십시오.

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

최종 버전 ( 1.1.1)을 최신 버전으로 업데이트하십시오 .


0

첨가

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

나를 위해이 정확한 문제를 해결했습니다.


이것은 이미 받아 들여진 답변에 명시되어 있습니다. 최신 버전이 있는지 확인하고 대신 사용하십시오.
코드 견습생

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) 테스트 클래스가 시작될 때 .


어디에서 이런 일이 발생했는지 테스트 할 수 있습니까?
코드 견습생

0

단편 소설 버전 :

Gradle을 최신 버전으로 업그레이드

2020 년 2 월 15 일에이 질문에 대한 답변을 드리겠습니다. 불행히도, 여기 및 다른 곳에서 언급 된 모든 가능한 해결책을 다 써버 렸습니다.

그렇습니다. 내장 기능인 "Andoridx로 마이그레이션"을 사용하면 대상 SDK 버전과 gradle 버전을 업그레이드해야한다는 것을 상기시킬 수 있습니다. gradle 버전을 2.0.2에서 3.5.3으로 업그레이드 한 후 그들은 단지 작동합니다, 심지어 오래된 수입 명세서도 작동합니다.


안녕하세요,이 오래된 질문은 이미 받아 들여진 답변이 있으며 귀하의 답변이 질문에 새로운 것을 추가하는 방법을 알지 못합니다. 답변이 기존 답변에 새로운 내용을 추가하지 않은 경우 답변을 피하십시오. 감사합니다
hippozhipos

허용 된 답변은 테스트 종속성을 AndroidX 테스트 라이브러리로 업데이트하는 링크를 제공합니다. 이것은 당신이 시도한 모든 것들에서 그것을 고쳤을 것입니다.
코드 견습생

0

Google IOSched 앱을 따라 디버그 및 릴리스가 동일한 소스 디렉토리를 공유하는 세 가지 빌드 유형 [디버그, 릴리스, 스테이징]으로 프로젝트를 설정할 때 동일한 오류가 발생했습니다.

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.