Không thể giải quyết biểu tượng 'AndroidJUnit4'


139

Rõ ràng tôi cần thống kê nhập khẩu chính xác để giải quyết vấn đề này. Theo các tài liệu choAndroidJUnit4 , điều này nên

import android.support.test.runner.AndroidJUnit4;

Khi tôi làm điều đó, Android Studio nổi bật runnermàu đỏ và phàn nàn "Không thể giải quyết biểu tượng 'người chạy'".

Lý lịch

Tôi đã đến điểm này bằng cách làm theo các hướng dẫn trên trang web Nhà phát triển Android để thiết lập các thử nghiệm bằng UI Automator . Vấn đề đầu tiên tôi gặp phải là điều đó com.android.support:support-v4:22.2.0com.android.support.test:runner:0.2phụ thuộc vào các phiên bản khác nhau của com.android.support:support-annotations. Tôi đã làm theo các đề xuất từ báo cáo lỗi Android này và thêm các mục sau allprojectsvào dự án của tôi build.gradle:

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

Điều này đã giải quyết lỗi ngay lập tức, nhưng tôi nghi ngờ nó dẫn đến các vấn đề hiện tại của tôi. Có ai có bất cứ đề nghị về cách khắc phục điều này?

Các phần có liên quan từ `./gradlew: app: phụ thuộc

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

Điều đó cho thấy rằng bản dựng của bạn bị mất com.android.support.test:runnerhoàn toàn. Bạn có thể xác nhận thông qua gradle dependenciesrằng bạn vẫn đang thực hiện việc này sau khi resolutionStrategythay đổi không?
CommonsWare

@CommonsWare Đã thêm đầu ra phụ thuộc vào câu hỏi của tôi. Tôi không biết những gì (*)có nghĩa là sau com.android.support.test:runner:0.2.
Code-Apprentice

Theo folks Gradle , dấu hoa thị "có nghĩa là chế độ xem dạng cây của biểu đồ phụ thuộc bị cắt ngắn tại thời điểm này vì một phần của biểu đồ đã được liệt kê trước đó." Tôi không biết tại sao điều này không hiệu quả với bạn.
CommonsWare

1
Lưu ý rằng câu trả lời của @stemadsen từ năm 2018 có khả năng phù hợp hơn các câu trả lời khác. Ai đó đã từng viết về một bài kiểm tra giữ các câu hỏi cùng năm này qua năm khác, nhưng câu trả lời đã thay đổi ...
Roy Falk

Câu trả lời:


197

Hãy chắc chắn rằng ứng dụng của bạn trong biến thể xây dựng gỡ lỗi. Chuyển đến Build> Chọn Build Variant ... và phần sau sẽ hiển thị:

nhập mô tả hình ảnh ở đây


5
Cảm ơn, bạn đã cứu tôi
Sofa

10
Ban phước cho bạn Tài liệu không bao giờ nói "công cụ này sẽ chỉ hoạt động trong gỡ lỗi". Rất bực bội.
Chantell Osejo

26
Ồ Bình chọn x 1 triệu. Đây là câu trả lời tôi đã tìm kiếm trong nhiều ngày. Cũng tìm thấy điều này để bạn có thể thay đổi loại xây dựng để sử dụng cho nó. android { testBuildType "staging"}
WIllJBD

5
Tôi sẽ phải báo cáo lỗi cho nhóm Android Studio Tools. Ngay cả các kiểu xây dựng kế thừa từ debugkhông hoạt động trừ khi được đặt thành "gỡ lỗi" rõ ràng
Gautham C.

1
wow, tôi đang sử dụng buildType cutom với initWith (buildTypes.debug) và vẫn không thành công. Chỉ và chỉ khi tôi đang sử dụng gỡ lỗi trực tiếp hoạt động!
Karoly

119

Tôi đã phạm sai lầm khi đặt các lớp kiểm tra tại src / test . Sau khi chuyển chúng sang src / androidTest / java / sự phụ thuộc đã được giải quyết.


Trong trường hợp của tôi, thư mục kiểm tra của tôi là src / test vì một số lý do, sau đó tôi phải đổi tên nó thành src / androidTest và nó đã giải quyết vấn đề của tôi, sau 3 giờ ...
Teo Inke

69

Ok đây là lỗi của bạn và của tôi!

Nếu chúng ta sẽ viết một pice mã cho Kiểm tra đơn vị cục bộ, chúng ta không nên sử dụng @RunWith(AndroidJUnit4.class)vì chúng ta không sử dụng AndroidJUnit4 nhưng chúng ta cần Junit4. vì vậy chúng tôi nên viết @RunWith(JUnit4.class). Và tất nhiên tập tin kiểm tra java của bạn nằm trong app/src/test/java/your.package.namethư mục.

Khác nếu (!!) chúng tôi muốn viết một số Kiểm tra đơn vị thiết bị Android, chúng tôi nên đặt các tệp java thử nghiệm của mình vào app/src/androidTest/java/your.package.namethư mục và sử dụng chú thích như@RunWith(AndroidJUnit4.class)


Tôi đang sử dụng Maven, sau đó thì sao?
JohnyTex

2
@JohnyTex Sử dụng Maven không ảnh hưởng đến câu trả lời của tôi. Nó chỉ phụ thuộc vào cấu trúc tập tin dự án của bạn.
Sepehr Behroozi

34

Cập nhật

Thư viện kiểm tra Android hiện là một phần của AndroidX. Hãy chắc chắn sử dụng các phụ thuộc Gradle chính xác được tìm thấy trong tài liệu chính thức .

Câu trả lời gốc

Tôi thấy ở đây có các phiên bản mới hơn của Thư viện hỗ trợ thử nghiệm so với những gì tôi đang sử dụng:

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

Lưu ý: Hãy chắc chắn sử dụng các phiên bản mới nhất của các thư viện này. Câu hỏi này là từ thời mà Thư viện hỗ trợ kiểm tra Android còn mới và số phiên bản ở đây đã rất lỗi thời.


3
Tôi tự hỏi tại sao tài liệu đề cập không có gì về điều này, trừ khi tôi bỏ lỡ nó. Sẽ cứu tôi một số đau buồn.
Nom1fan

@Karoly Mình vẫn có vấn đề. Bạn đã tìm ra được giải pháp nào chưa?
Mahdi

26

Tôi đã giải quyết vấn đề bằng cách thực hiện một thay đổi nhỏ trong tệp build.gradle của ứng dụng. Trong dependencies { ... }phần này, đảm bảo bao gồm dòng sau:

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

hoặc bất kỳ phiên bản nào là phiên bản mới nhất tại thời điểm đó ( ...Compilekhông được chấp nhận và đã được thay thế bởi ...Implementation). Lưu ý việc sử dụng debugImplementation. Android Studio đề xuất tự động - bao gồm nó với androidTestImplementation, không hoạt động.

Tôi đã tìm ra cách thay đổi nó từ thử nghiệm sang gỡ lỗi bằng cách tìm trong Cấu trúc dự án trong phần Phụ thuộc của mô-đun ứng dụng, nơi bạn có thể thay đổi phạm vi của từng phụ thuộc, xem bên dưới.

Cơ cấu dự án


Lưu ý rằng điều này sẽ biên dịch thư viện hỗ trợ thử nghiệm vào APK.
Code-Apprentice

Cũng làm việc với testImplementation "com.android.support.test: quy tắc: 1.0.2"
Prat

10

Lưu ý rằng OP này hiện đã có vào năm 2019, 4 tuổi vì vậy nếu bạn đang sử dụng Android X thì AndroidJUnit4.classkhông được dùng nữa, bạn có một lỗi ở đó và một lỗi nữa với điều này androidx.test.ext.junit.runners.AndroidJUnit4. Tôi đề nghị đọc các liên kết này để giải quyết vấn đề.

AndroidJUnit4. Class không được dùng nữa: Làm thế nào để sử dụng androidx.test.ext.junit.runners.AndroidJUnit4?

Di chuyển các bài kiểm tra Junit4 sang androidx: Nguyên nhân nào khiến 'người chạy đại biểu không thể tải'? Đối với tôi, Android Studio đề nghị thay thế

@RunWith(AndroidJUnit4.class)

không được chấp nhận

@RunWith(AndroidJUnit4ClassRunner.class)

và điều này

androidx.test.ext.junit.runners.AndroidJUnit4

Với cái này

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

Sau đó, lỗi không còn nữa nhưng tôi không biết thử nghiệm trong tương lai có chạy được không?!


@ Code-Apprentice - Cảm ơn bạn rất nhiều vì đã chỉnh sửa, bây giờ nó đẹp hơn nhiều
leonidaa

8

Trong trường hợp của tôi, điều này đã giúp phát hành biến thể:

android {
    ...
    testBuildType "release" 
}

Bạn có thể đưa ra một giải pháp đầy đủ hơn. Tôi không hiểu bối cảnh của những gì bạn đã làm.
Code-Apprentice

Tôi gặp phải vấn đề "Không thể giải quyết biểu tượng 'AndroidJUnit4'" trong bài kiểm tra espresso của mình khi tôi thay đổi biến thể xây dựng thành "phát hành". Ngay sau khi tôi thêm tuyên bố này (testBuildType "phát hành") vào build.gradle cấp độ ứng dụng (được lấy từ developer.android.com/studio/test/index.html#add_a_new_test ) thì vấn đề này đã biến mất.
Andrew Glukhoff

Tôi định dạng câu trả lời của bạn mã trong câu trả lời của bạn. Bạn nên thêm chi tiết, chẳng hạn như liên kết từ bình luận của bạn và mô tả nơi khối này đi trong dự án của bạn.
Code-Apprentice

7

Nguyên nhân phổ biến của vấn đề này là khi thêm phụ thuộc bên dưới:

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

Đây là một phụ thuộc chính xác nếu bạn sẽ sử dụng các bài kiểm tra cụ (các bài kiểm tra trong androidTest gói java)

Nhưng để thực hiện các thử nghiệm đơn vị cục bộ (thử nghiệm trong testgói java) trong khi sử dụng phụ thuộc đã đề cập ở trên; sau đó bạn sẽ phải đối mặtCannot resolve symbol 'AndroidJUnit4'

Đó là bởi vì lệnh androidTestImplementationđược sử dụng để nhập các thư viện trong các thử nghiệm cụ, nhưng không phải trong các thử nghiệm JVM / đơn vị cục bộ.

Nếu bạn muốn sử dụng AndroidJUnit4trong một thử nghiệm JVM / đơn vị cục bộ, thì hãy sử dụng phụ thuộc bên dưới thay thế

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

Điều tương tự cũng được áp dụng nếu bạn thêm phụ thuộc sau trong khi sử dụng AndroidJUnit4trong kiểm tra cụ, bạn cũng sẽ nhận được Cannot resolve symbol 'AndroidJUnit4'; bởi vì bạn đang sử dụng chỉ thị sai.


1
Trong kịch bản trong câu hỏi ban đầu của tôi, tôi đã chạy các bài kiểm tra cụ. Tuy nhiên, đây là một sự khác biệt lớn để thực hiện và hy vọng sẽ giúp khách truy cập cho câu hỏi này trong tương lai.
Code-Apprentice

5

Nếu bất cứ ai vẫn gặp phải vấn đề này:

Không thể giải quyết biểu tượng 'AndroidJUnit4'

và sử dụng API 27, trong build.gradleđó có trong mô-đun ứng dụng, thêm các dòng sau:

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

đặt mã này vào phụ thuộc của bạn

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
Khi tôi viết câu hỏi này, tôi chưa thêm espresso như một sự phụ thuộc cho các bài kiểm tra đơn vị.
Code-Apprentice

+1 Tôi thực sự đã tìm ra nó ngay trước khi tôi nhìn thấy điều này, nhưng vâng, đây là những gì tôi đã làm và nó đã giải quyết vấn đề của tôi.
Tony D

2
Thực hiện theo hai câu trả lời dưới đây từ @sepehr. Lớp AndroidJunit4 không có trong gói espresso do nó hiện diện trong gói android.support.test.runner. và tất cả những gì bạn phải làm là bao gồm @Runwith (AndroidJunit4. class) được viết ở trên / cho trường hợp thử nghiệm có trong src / Androidtest / java, INSTED OF bao gồm trong các trường hợp thử nghiệm được viết dưới src / test / java.
Khay

2

Nếu bạn đang sử dụng dự án với nhiều kiểu xây dựng thì loại xây dựng được chọn trong cửa sổ biến thể xây dựng phải được đề cập với thẻ testBuildType trong tệp build.gradle của mô-đun.

Ví dụ: Nếu bạn đang sử dụng gỡ lỗi kiểu xây dựng thì bạn nên thêm android{testBuildType "debug" }, nếu sử dụng giai đoạn thì thêm android{testBuildType "stage"}câu lệnh trong thẻ android.


Bạn có đề nghị chỉnh sửa tệp xây dựng nếu bạn muốn chuyển đổi biến thể đang được thử nghiệm?
nasch



1

Thêm phụ thuộc này vào tệp build.gradle của bạn:

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

Cập nhật phiên bản kết thúc ( 1.1.1) với phiên bản mới nhất được phát hành.


0

Thêm

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

giải quyết vấn đề chính xác này cho tôi.


Điều này đã được nêu trong câu trả lời được chấp nhận. Bạn cũng nên xem nếu có một phiên bản mới hơn và sử dụng thay thế.
Code-Apprentice

AndroidTestCompile có giống như biên dịch không?
donlys

compilechỉ thị phụ thuộc tên được sử dụng trong ứng dụng chính trong khi androidTestComiplephụ thuộc tên được sử dụng để thử nghiệm. Vì vậy, câu trả lời đúng là sử dụng androidTestCompile, không compile.
Code-Apprentice

0

Như danh sách các câu trả lời chứng minh, điều này có thể được gây ra bởi một vài điều. Một cái nữa cho danh sách:

Tôi đã chạy một LINT quá nhiệt tình loại bỏ tất cả hàng nhập khẩu không sử dụng. Điều này sẽ tạo ra các lỗi tương tự, và rất dễ bỏ lỡ rằng đây là vấn đề.

Android-studio sẽ làm nổi bật các tham chiếu bị thiếu trong mã kiểm tra - và cửa sổ bật lên ALT-ENTER sẽ xuất hiện (đây là bit rất dễ bỏ lỡ).

Tiếp theo, tôi cần xóa các kiểm tra khỏi LINT - hoặc ít nhất là vô hiệu hóa cảnh báo này.

Chỉnh sửa: @ Code-Apprentice, các dòng bị thiếu là:

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;

Vì vậy, lỗi đầu tiên trong tệp là @RunWith(AndroidJUnit4.class)ở đầu lớp kiểm tra của tôi.


Bạn có thể hiển thị một bài kiểm tra ví dụ nơi điều này xảy ra cho bạn?
Code-Apprentice

0

Phiên bản truyện ngắn:

Nâng cấp Gradle của bạn lên phiên bản mới nhất

Tôi đang trả lời bài đăng câu hỏi này vào ngày 15 tháng 2 năm 2020. Thật không may, tôi đã cạn kiệt mọi giải pháp có thể được đề cập ở đây và các nơi khác.

Vâng, không ai trong số họ ở trên làm việc. Tôi sử dụng chức năng tích hợp, "Di chuyển đến Andoridx", nó có thể nhắc nhở tôi rằng tôi phải nâng cấp các phiên bản SDK mục tiêu và phiên bản phân loại của mình. Sau khi tôi nâng cấp phiên bản lớp của tôi từ 2.0.2 lên 3.5.3. Họ chỉ hoạt động, thậm chí báo cáo nhập khẩu cũ hoạt động.


Xin chào, đây là một câu hỏi cũ đã có câu trả lời được chấp nhận và tôi không thấy câu trả lời của bạn thêm bất cứ điều gì mới vào câu hỏi. Vui lòng tránh trả lời nếu câu trả lời của bạn không thêm bất cứ điều gì mới vào câu trả lời hiện có. Cảm ơn
hippozhipos

Câu trả lời được chấp nhận cung cấp một liên kết để cập nhật các phụ thuộc kiểm tra vào thư viện Kiểm tra AndroidX. Đây có thể là thứ đã sửa nó trong tất cả những thứ bạn đã thử.
Code-Apprentice

0

Tôi cũng gặp lỗi tương tự khi theo dõi ứng dụng Google IOSched và thiết lập dự án của mình với ba loại bản dựng [gỡ lỗi, phát hành, dàn dựng] trong đó gỡ lỗi và phát hành chia sẻ cùng một thư mục nguồn

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

Trong trường hợp này, chỉ định testBuildTypetệp build.gradle cấp mô-đun của bạn và dự án sẽ có thể phân giải biểu tượng 'AndroidJUnit4'.

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

testBuildType "staging"
...

Tham khảo: https://github.com/google/iosched/blob/master/mobile/build.gradle

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.