IntelliJ IDEA dengan Junit 4.7 “!!! JUnit versi 3.8 atau yang lebih baru diharapkan: "

206

Ketika saya mencoba menjalankan tes berikut di IntelliJ IDEA saya mendapatkan pesan:

"!!! JUnit versi 3.8 atau yang lebih baru diharapkan:"

Perlu dicatat bahwa ini adalah proyek Android yang saya kerjakan di IntelliJ IDEA 9.

public class GameScoreUtilTest {
    @Test
    public void testCalculateResults() throws Exception {
        final Game game = new Game();

        final Player player1 = new Player();
        {
            final PlayedHole playedHole = new PlayedHole();
            playedHole.setScore(1);
            game.getHoleScoreMap().put(player1, playedHole);
        }
        {
            final PlayedHole playedHole = new PlayedHole();
            playedHole.setScore(3);
            game.getHoleScoreMap().put(player1, playedHole);
        }
        final GameResults gameResults = GameScoreUtil.calculateResults(game);

        assertEquals(4, gameResults.getScore());
    }
}

Jejak tumpukan penuh terlihat seperti ini ...

!!! JUnit version 3.8 or later expected:

java.lang.RuntimeException: Stub!
    at junit.runner.BaseTestRunner.<init>(BaseTestRunner.java:5)
    at junit.textui.TestRunner.<init>(TestRunner.java:54)
    at junit.textui.TestRunner.<init>(TestRunner.java:48)
    at junit.textui.TestRunner.<init>(TestRunner.java:41)
    at com.intellij.rt.execution.junit.JUnitStarter.junitVersionChecks(JUnitStarter.java:152)
    at com.intellij.rt.execution.junit.JUnitStarter.canWorkWithJUnitVersion(JUnitStarter.java:136)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:49)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:110)

Process finished with exit code -3
benstpierre
sumber
Intellij 9, tambalan terbaru.
benstpierre
Saya punya solusi di sini stackoverflow.com/questions/29172698/…
voronnenok
Jujur saya akhirnya punted menggunakan plugin Android di IntelliJ dan menggigit peluru dan menggunakan Android Studio terbaru. semuanya baik
Kirby
Memetikan orang lain datang ke sini tanpa "Tes" dalam nama kelas Tes mereka; Anda harus menambahkan "Uji" saudara. Memberi nama kelas Anda "GameEngine" akan menyebabkan kesalahan yang sama, Anda dapat menyelesaikannya dengan membuatnya "GameEngineTest". Bersulang!
recepinanc

Jawaban:

364

Masalah ini terjadi karena Android Platform ( android.jar) sudah mengandung kelas JUnit. Pelari uji IDEA memuat kelas-kelas ini dan melihat bahwa mereka berasal dari JUnit lama, saat Anda mencoba menggunakan tes beranotasi yang merupakan fitur JUnit baru, oleh karena itu Anda mendapatkan kesalahan dari pelari uji.

Solusinya sederhana, buka Project Structure| Modules| Dependencies, dan pindahkan ke junit-4.7.jaratas, sehingga muncul sebelumnya Android 1.6 Platform di classpath. Sekarang pelari tes akan senang karena memuat versi JUnit baru.

CrazyCoder
sumber
9
Hanya untuk membuat orang sadar ini masih menjadi masalah dengan versi Android yang lebih baru.
Chris.Jenkins
memecahkan masalah dalam pakar juga dengan menempatkan ketergantungan yang disediakan android setelah dependensi tes
avianey
18
Saya memiliki proyek Android bertahap yang menggunakan robolectric seperti yang dijelaskan di sini: peterfriese.de/android-testing-with-robolectric dan ketika saya memindahkan Platform Android dari 1 di classpath, saya mendapatkan pengecualian berikut:Class not found: "com.example.intellijgradletest.MainActivityTest"
Heath Borders
7
Di IDEA 14.0.3 untuk mengubah urutan dependen, Anda harus menggunakan panah. Seret dan Jatuhkan tidak berfungsi.
david.perez
4
Di studio android, file-file ketergantungan di-autogenerasi. Karenanya tidak mungkin untuk bergerak naik / turun. Apakah ada cara lain untuk menyelesaikan masalah ini?
iMDroid
35

masukkan deskripsi gambar di sini

modul saya adalah modul perpustakaan java, jadi mengubah JRE ke 1.8 java menyelesaikan masalah.

Atau, Anda juga dapat melakukannya secara global melalui Pengaturan Modul> Lokasi SDK> JDK, menentukan JDK 8 Oracle alih-alih salinan Android SDK.

nutella_eater
sumber
Ini benar-benar berfungsi dan juga masuk akal mengingat konteks masalah.
AgentKnopf
Dalam kasus saya, saya perlu mengubah JRE untuk Junit di Defaults
Rafael
Cara lain: Edit jdk.table.xml Anda di ~/Library/Preferences/AndroidStudioX.X/options/jdk.table.xmlatau C:\Users\Name\.AndroidStudioX.X\config\options\jdk.table.xmldi Windows. Temukan node <name value="Android API 28 Platform" />dan atur <annotationsPath>ke <root url="jar://$USER_HOME$/Android-SDK/platforms/android-28/data/annotations.zip!/" type="simple" />. Juga memastikan <classPath>simpul berisi platforms/android-28/...di kedua URL jalur file. Sesuaikan "Android-SDK" ke nama folder Anda.
Mr-IDE
Ini bekerja untuk saya! Cukup ubah dari Default (Android API 28) ke 1.8 (Java) dan berfungsi!
aiueoH
8

Saya punya masalah dengan proyek multi-modul (libgdx). Satu modul adalah Java murni dan memiliki tes. Solusi saya adalah mengatur "gunakan JRE alternatif" menjadi "Java 1.8" dalam menjalankan konfigurasi tes unit saya. Ini memastikan tidak ada android.jar ada di classpath dan pelari junit 4.x digunakan.

Uwe Post
sumber
Anda tidak benar-benar perlu menggunakan 1.8. Cukup memilih 1,7 yang tidak datang dengan sdk Android.
kingston
8

Saya mendapat kesalahan yang sama saat membuat keduanya Unit Testdan Android Instrument Testdi Android Studio 1.4+ dan itu mulai membingungkan. Untuk menghindari kesalahan ini pastikan kelas tes Anda berada Android Testsdi bawahRun/Debug Configurations

  1. Pastikan Anda mengikuti instruksi dengan benar https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests.html
  2. Pastikan Test Artifactdalam Build Variantsdiatur keAndroid Instrumentation Tests
  3. Klik menu Run>Edit Configuration
  4. Pastikan nama kelas / metode Anda dalam Android TestsbukannyaJUnit
  5. Jika sudah di JUnitcukup hapus konfigurasi dan klik kanan pada file yang ingin Anda uji dan Runlagi. Ini kemudian akan membuat bagian konfigurasi di bawah Android Testsdan berjalan pada perangkat / emulator.
CallMeLaNN
sumber
4
INI BEKERJA UNTUK SAYA => Jika berada di JUnit cukup hapus konfigurasi dan klik kanan pada file yang ingin Anda uji dan Jalankan lagi. Ini kemudian akan membuat konfigurasi di bawah bagian Tes Android dan dijalankan pada perangkat / emulator.
Devendra Vaja
Bekerja untuk saya juga. Saya menjalankan tes yang sama setelah memindahkannya dari testfolder ke androidTestfolder. Android Studio tidak memperbarui konfigurasi jalankan setelah melakukan ini
Daniil
5

Untuk Android Studio - mulai dari Android Studio 1.1 Beta 4 , Google telah menambahkan dukungan untuk plugin Android Gradle 1.1.0-RC . Plugin baru mendukung Unit Testing melalui Android Studio menggunakan junit 4+.

Ini masih eksperimental dan ada beberapa langkah manual untuk mengatur ini.

ZahiC
sumber
Ini bekerja tetapi Android Studio masih memiliki masalah dengan konfigurasi pembuatan otomatis untuk pengujian sehingga setiap kali Anda harus memperbaiki konfigurasi yang sedang berjalan dengan memilih kembali paket pengujian. Kalau tidak, NullPointerException selama uji coba.
Alfishe
4

Untuk semua orang yang membaca posting ini dan masih memiliki masalah yang sama dengan AndroidStudio 1.0. Anda tidak dapat mengubah urutan ketergantungan di AndroidStudio jika IDE menulis ulang secara otomatis. Dan, bahkan jika Anda berhasil mengubah urutan dengan memodifikasi file .iml, Anda akan mendapatkan "kelas tidak ditemukan ...". Ini karena jalur keluaran Tes tidak dapat ditetapkan pada AndroidStudio.

Sebenarnya, ada solusi untuk membuat AndroidStudio, Junit dan Robolectric bekerja bersama. Lihatlah https://github.com/JCAndKSolutions/android-unit-test ini dan gunakan plugin ini juga: https://github.com/evant/android-studio-unit-test-plugin

Berfungsi sempurna untuk saya.

Rontho
sumber
2

Saya mendapatkan kesalahan yang sama ketika saya membuat paket junit saya sendiri

masukkan deskripsi gambar di sini

Untuk memperbaikinya, saya telah menambahkan dua baris ini di file gradle aplikasi saya seperti yang dijelaskan di sini :

dependencies {
    ...
    // Required -- JUnit 4 framework
    testCompile 'junit:junit:4.12'
    // Optional -- Mockito framework
    testCompile 'org.mockito:mockito-core:1.10.19'
}
Kevin ABRIOUX
sumber
1

Ada dua hal yang bisa saya bayangkan terjadi

  • Jika IDE Anda mencoba memulai tes Android Junit yang langsung berjalan pada emulator, Anda tidak dapat menggunakan Junit4.
  • Jika Anda secara tidak sengaja menggunakan kelas junit yang disediakan dari jar android, mereka tidak dapat berjalan pada jvm normal karena hanya ada kelas kompilasi nyata untuk vm dalvik android.
Janusz
sumber
1

Ini juga terjadi pada saya di Android Studio 1.1 - meskipun harus mendukung pengujian unit tanpa plugin.

Di komputer lain (proyek yang sama, versi AS yang sama) saya menemukan bahwa ketika menjalankan tes unit, IDE tidak menambahkan file android.jar ke classpath, sedangkan di komputer saya melakukannya.

Tebakan terbaik saya adalah karena konversi yang kami lakukan dari Maven ke Gradle dan pindah dari intellij ke AS, beberapa cache pengaturan tetap berada di suatu tempat di mesin saya yang menyebabkan android.jar ditambahkan ke classpath.

Apa yang saya lakukan adalah menghapus semua cache terkait Android dari mesin saya (di bawah folder c: \ users \ USRE_NAME): .android .AndroidStudio .gradle .m2

Setelah itu saya membuka kembali proyek dan tes berhasil.

Masih mencoba memahami apa yang salah, tetapi ini harus melakukan trik untuk saat ini.

Yossi Shmueli
sumber
1

Saya mengalami masalah ini di Android Studio 1.5, karena saya tidak tahu bahwa saya harus mengganti pengaturan "Artefak Uji" di "Bangun Varian" (sudut kiri bawah jendela utama) dari "Tes Instrumentasi Android" ke "Tes Unit" ". Ketika Anda melakukannya, Anda dapat melihat file ExampleUnitTest.java di jendela Project.

ScarOnTheSky
sumber
1

Saya memiliki masalah yang sama tetapi karena alasan lain. Saya menggunakan IntelliJ dengan proyek java gradle biasa (bukan android) tetapi JDK diatur ke Android SDK di Project Structure(adalah JDK default karena beberapa alasan). Ini benar-benar bodoh tetapi IntelliJ tidak cukup baik untuk menunjukkan kepada saya apa yang salah, jadi saya terjebak pada hal itu.

Musim dingin
sumber
1

Inilah cara saya menyelesaikannya:

Edit Konfigurasi -> Default -> Android JUnit -> Tambahkan yang berikut ini ke Direktori Kerja:

$ MODULE_DIR $

liminal
sumber
1

Bagi saya masalah ini disebabkan oleh konfigurasi run yang ketinggalan zaman / rusak untuk tes. Saya hanya perlu menghapus konfigurasi, kemudian membuat yang baru dan masalahnya telah diperbaiki.

Hapus konfigurasi tes lama

mengejutkan
sumber
0

Dalam proyek Android yang saya miliki minifyEnabled = true, setelah saya mengubahnya untuk falsesemuanya berfungsi.

Przemo
sumber
0

Jika Anda menghapus

testOptions {
    unitTests.returnDefaultValues = true
}

dari Anda build.gradleitu akan berhasil

Chiara
sumber
0

Pergi ke Struktur Proyek -> Pengaturan Platform, ubah SDK menjadi 1,8 untuk menyelesaikan masalah saya.

Lin W
sumber
0

Saya juga menghadapi masalah yang sama, setelah berubah menjadi build.gradle bekerja dengan baik untuk saya.

ubah versi junit Anda di dalam build.gradle ke:

    testImplementation 'junit:junit:3.8'
Abdul Rizwan
sumber
0

Saya mengikuti jawaban CrazyCoder tetapi tidak ada file junit yang ditampilkan dalam dependensi. jadi saya unduh satu dari http://www.java2s.com/Code/Jar/j/Downloadjunitjar.htm , lalu menambahkannya dengan menekan tombol tambah di sebelah kanan. Dan itu berhasil

Ayman Harake
sumber
0

Mematikan "Gunakan embedded JDK" di Struktur Proyek / Lokasi SDK adalah apa yang membantu dalam kasus saya, tetapi saya tidak tahu persis apa alasan itu gagal di tempat pertama.

Wojciech Sadurski
sumber
0

Ganti folder android.jar Anda di libs dengan yang terbaru. Anda dapat mengunduhnya dari sini

DB377
sumber
0

Di AndroidStudio,, Open Project Structure -> SDK LocationAnda dapat melihat JDKlokasi, mengubah penggunaan "Gunakan tertanam JDK" untuk Anda miliki JDKuntuk diterapkan, lalu ubah kembali ke "Gunakan tertanam JDK" , itu mungkin bekerja

CrazyLiu
sumber
0

Dalam kasus saya, perubahan JREdalam Run Configurationsdosis memecahkan masalah, tetapi ketika saya klik tombol run di sebelah fungsi pengujian, JREpilihan akan reset ke default.

Akhirnya, mirip dengan jawaban @CrazyLiu, di Project Structure - SDK Location - JDK, pilih Embedded JDK. Karena tidak ada kotak centang di Android Studio 3.6.

Chenhe
sumber
0

Saya mendapatkan pesan yang sama

JUnit version 3.8 or later expected

oleh kesalahan pemula yang sederhana. Saya telah menggunakan nama paket dan nama kelas yang sama pada src / main dan src / test untuk sebuah kelas (kelas HomeController dalam kasus saya):

my-test-project
  +--pom.xml
  +--src
    +--main
      +--com
        +--example
          +--Application.java
          +--controller
            +--HomeController.java
    +--test
      +--com
        +--example
          +--ApplicationTest.java
          +--controller
            +--HomeController.java  <---- same package and class name: not good!

Dengan itu, kelas HomeController src / utama, serta kelas HomeController src / test, memiliki jalur lengkap yang sama:

com.example.controller.HomeController.class

Hasilnya: semua tes yang bergantung pada kelas HomeController telah gagal.

Baik mengubah nama paket dan / atau nama kelas telah menyelesaikan masalah. Di sini contohnya, ketika keduanya, nama paket dan nama kelas diubah:

my-test-project
  +--pom.xml
  +--src
    +--main
      +--com
        +--example
          +--Application.java
          +--controller
            +--HomeController.java
    +--test
      +--com
        +--example
          +--test                       <---- added (optional)
            +--ApplicationTest.java
            +--controller
              +--HomeControllerTest.java    <---- changed

Sekarang nama kelas yang sepenuhnya memenuhi syarat berbeda. Nama kelas src / HomeController utama adalah:

com.example.controller.HomeController.class

dan nama kelas src / test HomeHontrollerTest adalah:

com.example.test.controller.HomeControllerTest.class

Dengan nama-nama kelas yang sepenuhnya memenuhi syarat menjadi unik, masalahnya hilang.

Olli
sumber