IntelliJ IDEA z Junit 4.7 “!!! Oczekiwana wersja JUnit w wersji 3.8 lub nowszej: ”

206

Gdy próbuję uruchomić następujący test w IntelliJ IDEA, pojawia się komunikat:

„!!! Oczekiwano JUnit w wersji 3.8 lub nowszej:”

Należy zauważyć, że jest to projekt na Androida , nad którym pracuję w 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());
    }
}

Pełny ślad stosu wygląda następująco ...

!!! 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
źródło
Intellij 9, najnowsza łatka.
benstpierre
Mam rozwiązanie tutaj stackoverflow.com/questions/29172698/…
voronnenok
szczerze, w końcu zdecydowałem się na użycie wtyczki Android w IntelliJ, ugryzłem się i użyłem najnowszego Android Studio. wszystko jest w porządku
Kirby
Jeśli ktoś przybył tutaj bez nazwy „Test” w nazwie klasy Test; powinieneś dodać brata „Testuj”. Nazwanie twojej klasy „GameEngine” spowodowałoby ten sam błąd, możesz go rozwiązać, ustawiając go na „GameEngineTest”. Twoje zdrowie!
recepinanc

Odpowiedzi:

364

Ten problem występuje, ponieważ platforma Android ( android.jar) zawiera już klasy JUnit. Program testujący IDEA ładuje te klasy i widzi, że są one ze starego JUnit, podczas gdy próbujesz użyć testów z adnotacjami, które są cechą nowego JUnit, dlatego błąd uruchamia się z testera.

Rozwiązanie jest proste, otwórz Project Structure| Modules| Dependenciesi przesuń w junit-4.7.jargórę, aby pojawiła się wcześniej Android 1.6 Platform w ścieżce klasy. Teraz biegacz testowy będzie szczęśliwy, gdy załaduje nową wersję JUnit.

CrazyCoder
źródło
9
Aby uświadomić ludziom, że jest to nadal problem w późniejszych wersjach Androida.
Chris.Jenkins
rozwiązał również problem w maven, umieszczając zależność pod warunkiem po testowych zależnościach od
androida
18
Mam projekt Android stopniowy, który używa robolectric, jak opisano tutaj: peterfriese.de/android-testing-with-robolectric, a kiedy odsuwam platformę Android od 1. miejsca w ścieżce klas, otrzymuję następujący wyjątek:Class not found: "com.example.intellijgradletest.MainActivityTest"
Heath Borders
7
W IDEA 14.0.3 do zmiany kolejności zależności należy użyć strzałek. Przeciągnij i upuść nie działa.
david.perez
4
W Android Studio pliki zależności są generowane automatycznie. Dlatego nie jest możliwe poruszanie się w górę / w dół. Czy istnieje inny sposób rozwiązania tego problemu?
iMDroid
35

wprowadź opis zdjęcia tutaj

mój moduł jest modułem biblioteki Java, więc zmiana JRE na 1.8 Java rozwiązała problem.

Możesz także zrobić to globalnie, wybierając Ustawienia modułu> Lokalizacja SDK> JDK, określając JDK 8 Oracle zamiast kopii zestawu SDK systemu Android.

nutella_eater
źródło
To faktycznie działa, a także ma sens, biorąc pod uwagę kontekst problemu.
AgentKnopf
W moim przypadku musiałem zmienić JRE na Junit w Defaults
Rafael
Innym sposobem: edytuj plik jdk.table.xml w ~/Library/Preferences/AndroidStudioX.X/options/jdk.table.xmllub C:\Users\Name\.AndroidStudioX.X\config\options\jdk.table.xmlw systemie Windows. Znajdź węzeł <name value="Android API 28 Platform" />i ustaw go <annotationsPath>na <root url="jar://$USER_HOME$/Android-SDK/platforms/android-28/data/annotations.zip!/" type="simple" />. Upewnij się również, że <classPath>węzeł zawiera platforms/android-28/...oba adresy URL ścieżek plików. Dostosuj „Android-SDK” do nazwy folderu.
Mr-IDE,
To działa dla mnie! Wystarczy zmienić z domyślnego (Android API 28) na 1.8 (Java) i działa!
aiueoH,
8

Miałem ten problem z projektem wielomodułowym (libgdx). Jeden moduł to czysta Java i ma testy. Moim rozwiązaniem było ustawienie „użyj alternatywnego środowiska JRE” na „Java 1.8” w konfiguracji uruchamiania moich testów jednostkowych. Dzięki temu nie ma pliku android.jar na ścieżce klasy i używany jest moduł uruchamiający junit 4.x.

Uwe Post
źródło
Naprawdę nie musisz używać 1.8. Wystarczy wybrać 1.7, który nie jest dostarczany z Androidem SDK.
kingston
8

Mam ten sam błąd przy tworzeniu zarówno Unit Testi Android Instrument TestAndroid 1.4+ Studio i zaczął się mylić. Aby uniknąć tego błędu upewnij się, klasa test jest objęte Android TestsnaRun/Debug Configurations

  1. Upewnij się, że postępujesz zgodnie z instrukcją https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests.html
  2. Upewnij się, że parametr Test Artifactin Build Variantsjest ustawiony naAndroid Instrumentation Tests
  3. Kliknij menu Run>Edit Configuration
  4. Upewnij się, że nazwa klasy / metody jest w środku Android TestszamiastJUnit
  5. Jeśli tak, JUnitpo prostu usuń konfigurację i kliknij prawym przyciskiem myszy plik, który chcesz przetestować, i Runjeszcze raz. Następnie utworzy konfigurację w Android Testssekcji i będzie działać na urządzeniu / emulatorze.
CallMeLaNN
źródło
4
TO DZIAŁAŁO DLA MNIE => Jeśli jest w JUnit, po prostu usuń konfigurację i kliknij prawym przyciskiem myszy plik, który chcesz przetestować, i uruchom ponownie. Następnie utworzy konfigurację w sekcji Testy Androida i będzie działać na urządzeniu / emulatorze.
Devendra Vaja
Pracował również dla mnie. Przeprowadziłem ten sam test po przeniesieniu go z testfolderu do androidTestfolderu. Android Studio nie zaktualizowało konfiguracji uruchamiania po wykonaniu tej czynności
Daniil
5

Dla Androida Studio - począwszy od Android Studio 1.1 Beta 4 , Google dodało obsługę wtyczki Android Gradle 1.1.0-RC . Nowa wtyczka obsługuje testy jednostkowe w Android Studio przy użyciu junit 4+.

Jest to nadal eksperymentalne i istnieją pewne ręczne kroki, aby to skonfigurować.

ZahiC
źródło
Działa, ale Android Studio nadal ma problemy z automatycznym generowaniem konfiguracji do testów, więc za każdym razem musisz naprawić działającą konfigurację, wybierając ponownie pakiet testowy. W przeciwnym razie wyjątek NullPointerException podczas uruchomienia testowego.
Alfishe
4

Dla wszystkich, którzy czytają ten post i nadal mają ten sam problem z AndroidStudio 1.0. Nie można zmienić kolejności zależności w AndroidStudio, ponieważ IDE ponownie je zapisuje automatycznie. I nawet jeśli uda ci się zmienić kolejność, modyfikując plik .iml, otrzymasz „klasę nie znaleziono ...”. Wynika to z faktu, że Ścieżka wyjściowa testu nie może być ustawiona w AndroidStudio.

W rzeczywistości istnieje rozwiązanie umożliwiające współpracę AndroidStudio, Junit i Robolectric. Spójrz na ten https://github.com/JCAndKSolutions/android-unit-test i użyj również tej wtyczki: https://github.com/evant/android-studio-unit-test-plugin

Działa dla mnie idealnie.

rontho
źródło
2

Ten sam błąd występuje podczas tworzenia własnego pakietu junit

wprowadź opis zdjęcia tutaj

Aby to naprawić, dodałem te dwa wiersze do pliku oceny aplikacji, jak to wyjaśniono tutaj :

dependencies {
    ...
    // Required -- JUnit 4 framework
    testCompile 'junit:junit:4.12'
    // Optional -- Mockito framework
    testCompile 'org.mockito:mockito-core:1.10.19'
}
Kevin ABRIOUX
źródło
1

Mogę sobie wyobrazić dwie rzeczy

  • Jeśli twoje IDE próbuje uruchomić test Android Junit, który działa bezpośrednio na emulatorze, nie możesz użyć Junit4.
  • Jeśli przypadkowo użyłeś klas junit dostarczonych ze słoika z systemem Android, nie mogą one działać na normalnym jvm, ponieważ istnieją tylko prawdziwe skompilowane klasy dla androida dalvik vm.
Janusz
źródło
1

Zdarzyło mi się to również w Android Studio 1.1 - chociaż powinno ono obsługiwać testy jednostkowe bez wtyczki.

Na innych komputerach (ten sam projekt, ta sama wersja AS) odkryłem, że podczas uruchamiania testów jednostkowych IDE nie dodaje pliku android.jar do ścieżki klas, podczas gdy na mojej maszynie tak jest.

Moje przypuszczenie było takie, że z powodu konwersji, którą zrobiliśmy z Maven na Gradle i przejścia z intellij do AS, pewna pamięć podręczna ustawień pozostała gdzieś na mojej maszynie, co spowodowało dodanie android.jar do ścieżki klas.

To, co zrobiłem, to wyczyszczenie wszystkich pamięci podręcznych związanych z Androidem z mojego komputera (w folderze c: \ users \ USRE_NAME): .android .AndroidStudio .gradle .m2

Następnie ponownie otworzyłem projekt i testy zadziałały.

Wciąż próbuję zrozumieć, co poszło nie tak, ale na razie powinno to wystarczyć.

Yossi Shmueli
źródło
1

Miałem ten problem w Android Studio 1.5, ponieważ nie wiedziałem, że muszę zmienić ustawienie „Artefakt testowy” w „Wariantach budowy” (lewy dolny róg głównego okna) z „Testów oprzyrządowania Androida” na „Testy jednostkowe” „. Gdy to zrobisz, możesz zobaczyć plik ExampleUnitTest.java w oknie projektu.

ScarOnTheSky
źródło
1

Miałem ten sam problem, ale z innego powodu. Byłem na IntelliJ z normalnym projektem klasy Java (nie na Androidzie), ale JDK ustawiono na Android SDK w Project Structure(z pewnych powodów był to domyślny JDK). To jest naprawdę głupie, ale IntelliJ nie był wystarczająco miły, aby wskazać mi, co jest nie tak, więc utknąłem na tym.

Zimowy
źródło
1

Oto jak to rozwiązałem:

Edytuj konfiguracje -> Domyślne -> Android JUnit -> Dodaj następujące elementy do katalogu roboczego:

$ MODULE_DIR $

liminal
źródło
1

Dla mnie ten problem był spowodowany przez przestarzałą / uszkodzoną konfigurację uruchamiania testów. Po prostu musiałem usunąć konfigurację, a następnie utworzyć nową, a problem został rozwiązany.

Usuń starą konfigurację testową

wstrząsający
źródło
0

W projekcie na Androida miałem minifyEnabled = true, po zmianie na falsewszystko działało.

Przemo
źródło
0

Jeśli usuniesz

testOptions {
    unitTests.returnDefaultValues = true
}

od ciebie build.gradleto zadziała

Chiara
źródło
0

Przejdź do Struktura projektu -> Ustawienia platformy, zmień SDK na 1.8, rozwiązałem mój problem.

Lin W.
źródło
0

Miałem również ten sam problem, po przejściu na build.gradle działa dla mnie dobrze.

zmień wersję junita w build.gradle na:

    testImplementation 'junit:junit:3.8'
Abdul Rizwan
źródło
0

Postępowałem zgodnie z odpowiedzią CrazyCodera, ale nie było pliku junit pokazanego w zależnościach. więc pobrałem jeden z http://www.java2s.com/Code/Jar/j/Downloadjunitjar.htm , a następnie dodałem go, naciskając przycisk plus po prawej stronie. I zadziałało

Ayman Harake
źródło
0

Wyłączenie „Użyj osadzonego JDK” w strukturze projektu / lokalizacji pakietu SDK pomogło w moim przypadku, ale nie wiem dokładnie, co było przyczyną niepowodzenia.

Wojciech Sadurski
źródło
0

Zamień plik android.jar w folderze libs na najnowszy. Możesz go pobrać stąd

DB377
źródło
0

W AndroidStudio Open Project Structure -> SDK Locationmożesz zobaczyć JDKlokalizację, zmienić, użyć „Użyj wbudowanego JDK” , JDKaby zastosować, a następnie zmienić z powrotem na „Użyj osadzonego JDK” , może to działać

CrazyLiu
źródło
0

W moim przypadku zmiana JREw Run Configurationsdawce rozwiązać ten problem, ale gdy klikam przycisk run obok funkcji testowego, JREopcje zostaną przywrócone do domyślnych.

Wreszcie, podobnie jak odpowiedź @CrazyLiu, w Project Structure - SDK Location - JDKwybierz Embedded JDK. Ponieważ w Android Studio 3.6 nie ma pola wyboru.

Chenhe
źródło
0

Dostałem tę samą wiadomość

JUnit version 3.8 or later expected

przez prosty błąd początkującego. Użyłem tych samych nazw pakietów i nazw klas w src / main i src / test dla klasy (w moim przypadku klasa HomeController):

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!

Dzięki temu klasa src / main HomeController, a także klasa src / test HomeController, miały tę samą pełną ścieżkę:

com.example.controller.HomeController.class

Wynik: wszystkie testy zależne od klasy HomeController nie powiodły się.

Zmiana nazwy pakietu i / lub nazwy klasy rozwiązało problem. Oto przykład, w którym zmieniono zarówno nazwę pakietu, jak i nazwę klasy:

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

Teraz w pełni kwalifikowane nazwy klas różnią się. Nazwa klasy src / main HomeController to:

com.example.controller.HomeController.class

a nazwa klasy HomeHontrollerTest src / test to:

com.example.test.controller.HomeControllerTest.class

Ponieważ w pełni kwalifikowane nazwy klas są unikalne, problem znika.

Olli
źródło