IntelliJ IDEA กับ Junit 4.7“ !!! JUnit เวอร์ชัน 3.8 หรือใหม่กว่าที่คาดไว้:”


206

เมื่อฉันพยายามเรียกใช้การทดสอบต่อไปนี้ในIntelliJ IDEAฉันได้รับข้อความ:

"!!! JUnit เวอร์ชัน 3.8 ขึ้นไปที่คาดไว้:"

ควรสังเกตว่านี่เป็นโครงการAndroid ที่ฉันทำงานใน 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());
    }
}

การติดตามสแต็กเต็มมีลักษณะเช่นนี้ ...

!!! 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

Intellij 9 แพทช์ล่าสุด
benstpierre

ฉันมีทางออกที่นี่stackoverflow.com/questions/29172698/…
voronnenok

ในที่สุดฉันก็เขวี้ยงกับการใช้ปลั๊กอิน Android ใน IntelliJ และใช้สัญลักษณ์แสดงหัวข้อย่อยเล็กน้อยและใช้ Android Studio ล่าสุด ทุกอย่างเรียบร้อย
Kirby

เอาคนอื่นมาที่นี่โดยไม่ต้อง "ทดสอบ" ในชื่อคลาสทดสอบ คุณควรเพิ่มพี่ชาย "ทดสอบ" การตั้งชื่อคลาสของคุณ "GameEngine" จะทำให้เกิดข้อผิดพลาดเดียวกันคุณสามารถแก้ไขได้ด้วยการทำให้ "GameEngineTest" ไชโย!
recepinanc

คำตอบ:


364

ปัญหานี้เกิดขึ้นเนื่องจากแพลตฟอร์ม Android ( android.jar) มีคลาส JUnit อยู่แล้ว นักวิ่งทดสอบ IDEA จะโหลดคลาสเหล่านี้และเห็นว่ามาจาก JUnit เก่าในขณะที่คุณกำลังพยายามใช้การทดสอบที่มีคำอธิบายประกอบซึ่งเป็นคุณสมบัติของ JUnit ใหม่ดังนั้นคุณจะได้รับข้อผิดพลาดจากนักทดสอบ

การแก้ปัญหาง่าย ๆ เปิดProject Structure| Modules| Dependenciesและเลื่อนjunit-4.7.jarขึ้นเพื่อให้มาก่อน Android 1.6 Platformใน classpath ตอนนี้ผู้ทดสอบจะมีความสุขเนื่องจากโหลด JUnit รุ่นใหม่


9
เพียงเพื่อให้ผู้คนตระหนักว่านี่ยังคงเป็นปัญหาสำหรับ Android รุ่นใหม่กว่า
Chris.Jenkins

แก้ปัญหาใน Maven เช่นกันโดยการวางหุ่นยนต์พึ่งพาให้ไว้หลังจากการพึ่งพาการทดสอบ
avianey

18
ฉันมีโครงการ Android gradle ที่ใช้ robolectric ตามที่อธิบายไว้ที่นี่: peterfriese.de/android-testing-with-robolectricและเมื่อฉันย้ายแพลตฟอร์ม Android ออกจากที่ 1 ใน classpath ฉันได้รับข้อยกเว้นต่อไปนี้:Class not found: "com.example.intellijgradletest.MainActivityTest"
Heath Borders

7
ใน IDEA 14.0.3 สำหรับการเปลี่ยนลำดับการพึ่งพาคุณควรใช้ลูกศร การลากและวางไม่ทำงาน
david.perez

4
ใน android studio ไฟล์ที่ขึ้นต่อกันจะถูกสร้างอัตโนมัติ ดังนั้นจึงไม่สามารถเลื่อนขึ้น / ลงได้ มีวิธีอื่นในการแก้ไขปัญหานี้หรือไม่?
iMDroid

35

ป้อนคำอธิบายรูปภาพที่นี่

โมดูลของฉันเป็นโมดูลไลบรารี java ดังนั้นการเปลี่ยน JRE เป็น 1.8 java แก้ปัญหาได้

หรือคุณสามารถทำได้ทั่วโลกผ่านการตั้งค่าโมดูล> ตำแหน่ง SDK> JDK โดยระบุ JDK 8 ของ Oracle แทนสำเนาของ Android SDK


วิธีนี้ใช้งานได้จริงและสมเหตุสมผลตามบริบทของปัญหา
AgentKnopf

ในกรณีของฉันฉันต้องเปลี่ยน JRE สำหรับ Junit เป็นค่าเริ่มต้น
Rafael

อีกวิธีหนึ่ง: แก้ไขjdk.table.xmlของคุณที่~/Library/Preferences/AndroidStudioX.X/options/jdk.table.xmlหรือC:\Users\Name\.AndroidStudioX.X\config\options\jdk.table.xmlบน Windows ค้นหาโหนด<name value="Android API 28 Platform" />และการตั้งค่าของมันไป<annotationsPath> <root url="jar://$USER_HOME$/Android-SDK/platforms/android-28/data/annotations.zip!/" type="simple" />ตรวจสอบให้แน่ใจว่า<classPath>โหนดมีplatforms/android-28/...ใน URL พา ธ ของไฟล์ทั้งสอง ปรับ "Android-SDK" เป็นชื่อโฟลเดอร์ของคุณ
Mr-IDE

มันใช้งานได้สำหรับฉัน! เพียงเปลี่ยนจากค่าเริ่มต้น (Android API 28) เป็น 1.8 (Java) และใช้งานได้!
aiueoH

8

ฉันมีปัญหากับโครงการโมดูลหลายโมดูล (libgdx) หนึ่งโมดูลเป็นจาวาบริสุทธิ์และมีการทดสอบ โซลูชันของฉันคือตั้ง "ใช้ JRE สำรอง" เป็น "Java 1.8" ในการกำหนดค่าการทำงานของการทดสอบหน่วยของฉัน นี่ทำให้แน่ใจว่าไม่มี android.jar อยู่ใน classpath และใช้ junit 4.x runner


คุณไม่จำเป็นต้องใช้ 1.8 ก็เพียงพอที่จะเลือก 1.7 ที่ไม่ได้มาพร้อมกับ Android sdk
kingston

8

ฉันได้รับข้อผิดพลาดเดียวกันเมื่อสร้างทั้งสองUnit TestและAndroid Instrument Testใน Android Studio 1.4+ และมันเริ่มสับสน เพื่อหลีกเลี่ยงข้อผิดพลาดนี้ให้แน่ใจว่าระดับการทดสอบของคุณจะตกอยู่ภายใต้Android TestsบนRun/Debug Configurations

  1. ตรวจสอบให้แน่ใจว่าคุณทำตามคำแนะนำอย่างถูกต้องhttps://developer.android.com/training/testing/unit-testing/instrumented-unit-tests.html
  2. ตรวจสอบให้แน่ใจTest ArtifactในBuild Variantsการตั้งค่าเพื่อAndroid Instrumentation Tests
  3. คลิกเมนูRun>Edit Configuration
  4. ตรวจสอบให้แน่ใจว่าชื่อคลาส / วิธีการของคุณอยู่ข้างในAndroid TestsแทนJUnit
  5. หากอยู่ในนั้นJUnitเพียงแค่ลบการตั้งค่าและคลิกขวาที่ไฟล์ที่คุณต้องการทดสอบและRunอีกครั้ง จากนั้นจะสร้างการกำหนดค่าภายใต้Android Testsส่วนและจะทำงานบนอุปกรณ์ / ตัวจำลอง

4
สิ่งนี้ได้ผลกับฉัน => หากอยู่ใน JUnit เพียงแค่ลบการกำหนดค่าและคลิกขวาที่ไฟล์ที่คุณต้องการทดสอบและเรียกใช้อีกครั้ง จากนั้นจะสร้างการกำหนดค่าในส่วนการทดสอบ Android และเรียกใช้บนอุปกรณ์ / โปรแกรมจำลอง
Devendra Vaja

ทำงานให้ฉันเช่นกัน ฉันรันการทดสอบเดียวกันหลังจากย้ายจากtestโฟลเดอร์หนึ่งไปยังอีกandroidTestโฟลเดอร์ Android Studio ไม่ได้อัปเดตการกำหนดค่าการทำงานหลังจากทำเช่นนี้
Daniil

5

สำหรับ Android สตูดิโอ - เริ่มต้นจากAndroid สตูดิโอ 1.1 Beta 4 Google ได้เพิ่มการสนับสนุนสำหรับ Android Gradle ปลั๊กอิน 1.1.0-RC ปลั๊กอินใหม่รองรับการทดสอบหน่วยผ่าน Android Studio โดยใช้ junit 4+

นี่คือการทดลองและยังมีขั้นตอนแบบแมนนวลในการตั้งค่านี้


มันใช้งานได้ แต่ Android Studio ยังคงมีปัญหากับการกำหนดค่าอัตโนมัติที่สร้างขึ้นสำหรับการทดสอบดังนั้นทุกครั้งที่คุณต้องแก้ไขการเรียกใช้การกำหนดค่าโดยการเลือกแพคเกจการทดสอบอีกครั้ง มิฉะนั้น NullPointerException ระหว่างการทดสอบการทำงาน
Alfishe

4

สำหรับทุกคนที่อ่านโพสต์นี้และยังคงมีปัญหาเดียวกันกับ AndroidStudio 1.0 คุณไม่สามารถเปลี่ยนลำดับการพึ่งพาใน AndroidStudio มี IDE เขียนใหม่โดยอัตโนมัติ และแม้ว่าคุณจะสามารถเปลี่ยนคำสั่งได้โดยการแก้ไขไฟล์. iml คุณจะได้รับ "class not found ... " นี่เป็นเพราะเส้นทางทดสอบผลลัพธ์ไม่สามารถตั้งค่าได้บน AndroidStudio

ที่จริงแล้วมีวิธีแก้ปัญหาเพื่อให้ AndroidStudio, Junit และ Robolectric ทำงานร่วมกันได้ ลองดูที่https://github.com/JCAndKSolutions/android-unit-testและใช้ปลั๊กอินนี้เช่นกัน: https://github.com/evant/android-studio-unit-test-plugin

ทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน


2

ฉันมีข้อผิดพลาดเดียวกันเมื่อฉันสร้างแพ็คเกจ junit ของฉันเอง

ป้อนคำอธิบายรูปภาพที่นี่

ในการแก้ไขปัญหานี้ฉันได้เพิ่มสองบรรทัดนี้ในไฟล์ gradle ของแอพตามที่อธิบายไว้ที่นี่ :

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

1

มีสองสิ่งที่ฉันจินตนาการได้ว่าจะเกิดขึ้น

  • หาก IDE ของคุณพยายามเริ่มการทดสอบ Android Junit ที่รันบนตัวจำลองโดยตรงคุณจะไม่สามารถใช้ Junit4 ได้
  • หากคุณใช้คลาส junit ที่มาจากขวด android โดยไม่ตั้งใจพวกเขาไม่สามารถทำงานบน jvm ปกติได้เนื่องจากมีคลาสที่คอมไพล์แล้วเท่านั้นสำหรับ android dalvik vm

1

สิ่งนี้เกิดขึ้นกับฉันเช่นกันใน Android Studio 1.1 - แม้ว่ามันควรสนับสนุนการทดสอบหน่วยโดยไม่ต้องใช้ปลั๊กอิน

ในเครื่องอื่น (โครงการเดียวกันรุ่นเดียวกันของ AS) ฉันพบว่าเมื่อรันการทดสอบหน่วย IDE ไม่ได้เพิ่มไฟล์ android.jar ไปยัง classpath ขณะที่อยู่ในเครื่องของฉัน

การคาดเดาที่ดีที่สุดของฉันคือเนื่องจากการแปลงที่เราทำจาก Maven เป็น Gradle และย้ายจาก intellij ไปเป็น AS แคชของการตั้งค่าบางส่วนยังคงอยู่ในเครื่องของฉันที่ทำให้ android.jar ถูกเพิ่มใน classpath

สิ่งที่ฉันทำคือการล้างแคชที่เกี่ยวข้องกับ Android ทั้งหมดจากเครื่องของฉัน (ภายใต้โฟลเดอร์ c: \ users \ USRE_NAME): .android .AndroidStudio .gradle .m2

หลังจากนั้นฉันเปิดโครงการอีกครั้งและการทดสอบใช้งานได้

ยังคงพยายามที่จะเข้าใจสิ่งที่ผิดพลาด แต่ตอนนี้ควรทำเคล็ดลับสำหรับตอนนี้


1

ฉันมีปัญหานี้ใน Android Studio 1.5 เพราะฉันไม่รู้ว่าฉันต้องสลับการตั้งค่า "Test Artifact" ใน "Build Variants" (มุมซ้ายล่างของหน้าต่างหลัก) จาก "Android Instrumentation Tests" เป็น "การทดสอบหน่วย " เมื่อคุณดำเนินการคุณจะเห็นไฟล์ ExampleUnitTest.java ในหน้าต่างโครงการ


1

ฉันมีปัญหาเดียวกัน แต่ด้วยเหตุผลอื่น ฉันอยู่ใน IntelliJ กับโครงการ java gradle ปกติ (ไม่ใช่ android) แต่ JDK ถูกตั้งค่าเป็น Android SDK ในProject Structure(เป็นค่าเริ่มต้น JDK ด้วยเหตุผลบางอย่าง) นี่มันโง่จริงๆ แต่ IntelliJ ไม่ดีพอที่จะบอกฉันว่ามีอะไรผิดปกติดังนั้นฉันจึงติดอยู่กับมัน


1

นี่คือวิธีที่ฉันแก้ไขมัน:

แก้ไขการกำหนดค่า -> ค่าเริ่มต้น -> Android JUnit -> เพิ่มรายการต่อไปนี้ในไดเรกทอรีการทำงาน:

$ $ MODULE_DIR


1

สำหรับฉันปัญหานี้เกิดจากการกำหนดค่าการทำงานที่ล้าสมัย / เสียสำหรับการทดสอบ ฉันเพียงแค่ต้องลบการกำหนดค่าจากนั้นสร้างใหม่และปัญหาได้รับการแก้ไข

ลบการกำหนดค่าการทดสอบเก่า


0

ในโครงการ Android ที่ฉันมีminifyEnabled = trueหลังจากเปลี่ยนfalseทุกอย่างทำงาน



0

ไปที่โครงสร้างโครงการ -> การตั้งค่าแพลตฟอร์มเปลี่ยน SDK เป็น 1.8 เพื่อแก้ไขปัญหาของฉัน


0

ฉันยังเผชิญปัญหาเดียวกันหลังจากเปลี่ยนเป็น build.gradle มันใช้ได้ดีสำหรับฉัน

เปลี่ยนรุ่น Junit ของคุณใน build.gradle เป็น:

    testImplementation 'junit:junit:3.8'

0

ฉันทำตามคำตอบของ CrazyCoder แต่ไม่มีไฟล์ junit แสดงในการอ้างอิง ดังนั้นฉันจึงดาวน์โหลดจากhttp://www.java2s.com/Code/Jar/j/Downloadjunitjar.htmจากนั้นเพิ่มมันโดยการกดปุ่มบวกทางด้านขวา และมันก็ใช้งานได้


0

การปิด "ใช้ JDK ฝังตัว" ในโครงสร้างโครงการ / ตำแหน่ง SDK คือสิ่งที่ช่วยฉันได้ แต่ฉันไม่รู้ว่าอะไรเป็นสาเหตุที่ทำให้ล้มเหลวตั้งแต่แรก



0

ใน AndroidStudio Open Project Structure -> SDK LocationคุณสามารถดูJDKตำแหน่งเปลี่ยนใช้"ใช้ Embedded JDK"ให้เป็นเจ้าของJDKเพื่อสมัครแล้วเปลี่ยนกลับเป็น"ใช้ฝังตัว JDK"อาจใช้งานได้


0

ในกรณีของการเปลี่ยนแปลงJREในRun Configurationsปริมาณที่แก้ปัญหาได้ แต่เมื่อฉันคลิกที่ปุ่มการทำงานติดกับฟังก์ชั่นการทดสอบที่JREตัวเลือกจะตั้งค่าเริ่มต้น

สุดท้ายคล้ายกับคำตอบ @CrazyLiu 's ในเลือกProject Structure - SDK Location - JDK Embedded JDKเพราะไม่มีช่องทำเครื่องหมายใน Android Studio 3.6


0

ฉันได้รับข้อความเดียวกัน

JUnit version 3.8 or later expected

โดยความผิดพลาดเริ่มต้นง่าย ฉันใช้ชื่อแพ็คเกจและชื่อคลาสเดียวกันกับ src / main และ src / test สำหรับคลาส (คลาส 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!

ด้วยสิ่งนั้นคลาส src / main HomeController รวมถึง src / test คลาส HomeController มีพา ธ เต็มเหมือนกัน:

com.example.controller.HomeController.class

ผลลัพธ์: การทดสอบใด ๆ ที่ขึ้นอยู่กับคลาส HomeController ล้มเหลว

การเปลี่ยนชื่อแพ็กเกจและ / หรือชื่อคลาสได้แก้ไขปัญหาแล้ว นี่คือตัวอย่างเมื่อทั้งสองชื่อแพ็กเกจและชื่อคลาสถูกเปลี่ยน:

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

ตอนนี้ชื่อคลาสที่ผ่านการรับรองจะแตกต่างกันไป ชื่อคลาสของ HomeController src / main คือ:

com.example.controller.HomeController.class

และ src / test ชื่อคลาส HomeHontrollerTest คือ:

com.example.test.controller.HomeControllerTest.class

ด้วยชื่อคลาสที่ผ่านการรับรองแล้วว่าเป็นเอกลักษณ์ปัญหาจะหายไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.