シンボル「AndroidJUnit4」を解決できません


139

明らかに、この問題を解決するには、正しいインポート文が必要です。のドキュメントにAndroidJUnit4よると、これは

import android.support.test.runner.AndroidJUnit4;

そうすると、Android Studio runnerが赤くハイライト表示され、「シンボル 'runner'を解決できません」というメッセージが表示されます。

バックグラウンド

私は、Androidデベロッパーサイトのチュートリアルに従って、UI Automatorを使用してテストを設定することで、この時点に到達しました。私が遭遇した最初の問題はそれで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: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
Code-Apprentice

Gradleの人によれば、アスタリスクは「依存グラフのツリービューは、グラフのその部分がすでに前にリストされているため、この時点で省略されていることを意味します。」これがうまくいかない理由に困惑しています。
CommonsWare

1
2018年の@stemadsenの回答は、他の回答よりも関連性が高い可能性があることに注意してください。誰かがかつて同じ質問を毎年続けたテストについて書いたが、答えは変わった...
Roy Falk

回答:


197

アプリがデバッグビルドバリアントであることを確認してください。[ビルド]> [ビルドバリアントの選択...]に移動すると、以下が表示されます。

ここに画像の説明を入力してください


5
ありがとう、あなたは私を救った
ソファ

10
お大事に。ドキュメントには、「これはデバッグでのみ機能する」とは記載されていません。とてもイライラします。
Chantell Osejo 2016年

26
ワオ。賛成投票x 100万。これは私が何日も探していた答えです。また、これを使用して、使用するビルドタイプを変更できます。android { testBuildType "staging"}
WIllJBD 2016年

5
これについては、バグ報告をAndroid Studioツールチームに提出する必要があります。debug明示的に「デバッグ」に設定しない限り、継承タイプのビルドタイプでも機能しません
Gautham C.

1
うわー、私はinitWith(buildTypes.debug)でカットビルドbuildTypeを使用していますが、それでも失敗します。デバッグを直接使用している場合にのみ、機能します!
Karoly 2017

119

テストクラスをsrc / testに置くのを間違えました。それらをsrc / androidTest / java /に移動した後、依存関係は解決されました。


私の場合、テストフォルダーが何らかの理由でsrc / testだった場合、名前をsrc / androidTestに変更する必要があり、3時間後に問題が解決しました...
Teo Inke

69

わかりましたので、ここに間違いと私の間違いがあります。

我々はのためのコードのPICE書こうとしている場合はローカルユニットテストを我々は使用しないでください@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 2017

2
@JohnyTex Mavenを使用しても私の回答には影響しません。プロジェクトのファイル構造にのみ依存します。
セファーBehroozi

34

更新

Android Test Libraryが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 2018

@Karolyまだ問題があります。何か解決策を見つけましたか?
Mahdi

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:rules:1.0.2"でも動作します
プラット

10

このOPは現在4年前の2019年にあるので、Android Xを使用している場合AndroidJUnit4.classは廃止されることに注意してくださいandroidx.test.ext.junit.runners.AndroidJUnit4。エラーが発生し、さらに1つエラーが発生します。このリンクを読んで問題を解決することをお勧めします。

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;

その後エラーは消えましたが、実行中の将来のテストが問題ないかどうかわかりません!


CODE-見習い@ -編集用どうもありがとうございました、それは今非常に良くある
leonidaa

8

私の場合、これはリリースバリアントに役立ちました:

android {
    ...
    testBuildType "release" 
}

より完全なソリューションを提供できますか。私はあなたがしたことの文脈を理解していません。
Code-Apprentice

ビルドバリアントを「リリース」に変更すると、エスプレッソテストで「シンボル「AndroidJUnit4」を解決できません」という問題が発生しました。このステートメント(testBuildType "release")をアプリレベルのbuild.gradle(developer.android.com/studio/test/index.html#add_a_new_testから取得)に追加するとすぐに、この問題は解消されました。
Andrew Glukhoff、2018

私はあなたの答えをあなたの答えのコードにフォーマットしました。コメントからのリンクなどの詳細を追加し、このブロックがプロジェクトのどこに配置されるかを説明する必要があります。
Code-Apprentice

7

この問題の一般的な原因は、以下の依存関係を追加する場合です。

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

インストルメント済みテスト(androidTestJavaパッケージのテスト)を使用する場合、これは正しい依存関係です。

ただし、test上記の依存関係を使用しながらローカルユニットテスト(Javaパッケージのテスト)を実装する場合。それからあなたは直面しますCannot resolve symbol 'AndroidJUnit4'

これは、androidTestImplementationディレクティブが、インストルメント化されたテストでライブラリをインポートするために使用され、ローカルJVM /ユニットテストでは使用されないためです。

使用したい場合はAndroidJUnit4ローカルJVM /ユニットテストでは、代わりに依存関係の下に使用します

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

AndroidJUnit4インストルメント化されたテストで使用中に後者の依存関係を追加した場合も同じことが当てはまりますCannot resolve symbol 'AndroidJUnit4'。間違ったディレクティブを使用しているためです。


1
元の質問のシナリオでは、計装テストを実行していました。ただし、これは明確な区別であり、将来的にはこの質問への訪問者を助けることになるでしょう。
コード見習い

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
この質問を書いたとき、単体テストの依存関係としてエスプレッソをまだ追加していませんでした。
Code-Apprentice 2017年

+1実際にこれを見る直前に理解しましたが、そうです、これで私は問題を解決しました。
トニーD

2
@sepehrから以下の2つの回答に従ってください。AndroidJunit4クラスはespressoパッケージに含まれていません。android.support.test.runnerパッケージに含まれています。@Runwith(AndroidJunit4.class)をインクルードするだけで上記のテストケースがsrc / Androidtest / javaにあり、INSTED OFはsrc / test / javaの下にあるテストケースに含まれています。
Khay

2

複数のビルドタイプのプロジェクトを使用している場合は、ビルドバリアントウィンドウで選択したビルドタイプを、モジュールのbuild.gradleファイルのtestBuildTypeタグで言及する必要があります。

例:ビルドタイプデバッグを使用している場合はを追加しandroid{testBuildType "debug" }ステージを使用している場合android{testBuildType "stage"}はandroidタグにステートメントを追加します。


テストするバリアントを切り替える場合は、ビルドファイルを編集することをお勧めしますか?
-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'

この正確な問題を解決しました。


これは受け入れられた回答ですでに述べられています。また、より新しいバージョンがあるかどうかを確認し、代わりにそれを使用してください。
Code-Apprentice

androidTestCompileはコンパイルと同じですか?
donlys

compileディレクティブは、メインアプリでandroidTestComiple使用される依存関係を示し、テストに使用される依存関係を示します。したがって、正しい答えは使用androidTestCompileではなく使用することcompileです。
Code-Apprentice

0

回答のリストが示すように、これはいくつかの原因で発生する可能性があります。リストのもう1つ:

熱心すぎる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を最新バージョンにアップグレードする

私は2020年2月15日にこの質問の投稿に回答しています。残念ながら、私はここや他の場所で言及されているすべての可能な解決策を使い果たしました。

はい、上記のどれも動作しません。組み込み関数「Migrate to Andoridx」を使用しています。ターゲットSDKのバージョンとGradleのバージョンをアップグレードする必要があることを思い出させるかもしれません。Gradleバージョンを2.0.2から3.5.3にアップグレードした後。古いimportステートメントでさえ機能します。


こんにちは、これは古い質問です。すでに回答が承認されています。あなたの回答が質問に新しいものを追加する方法を確認できません。答えが既存の答えに新しいものを追加しない場合は、答えないでください。ありがとう
Hippozhipos

承認された答えは、AndroidX Testingライブラリへのテストの依存関係を更新するためのリンクを提供します。これはおそらく、あなたが試みたすべてのことでそれを修正したものです。
コード見習い

0

Google IOSchedアプリをフォローし、デバッグとリリースが同じソースディレクトリを共有する3つのビルドタイプ[デバッグ、リリース、ステージング]でプロジェクトを設定したときに、同じエラーが発生しました

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.