Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Junit5 with IntelliJ and Gradle

Trying to migrate my project to java8 + Junit5 using IntelliJ 2017.2

I have added junit-jupiter-api version 5.0.0-M6

and junit-platform-launcher version 1.0.0-M6

Project structure is a default maven convention src/test/java

Found a couple articles about this but none of them did solve my issue.

It runs nicely in a console, I presume this is something to do with the IntelliJ default JUnit Runner, or I am missing some dependencies?


When I Run a single test class all works fine but when I select the directory and Run all 'Tests' in Java like I used to do then I encounter few errors.

WARNING: TestEngine with ID 'junit-jupiter' failed to discover tests
java.lang.NoSuchMethodError: org.junit.platform.engine.TestDescriptor.pruneTree()V

Aug 02, 2017 2:44:56 PM org.junit.platform.launcher.core.DefaultLauncher handleThrowable
WARNING: TestEngine with ID 'junit-vintage' failed to discover tests
java.lang.NoSuchMethodError: org.junit.platform.engine.EngineDiscoveryRequest.getDiscoveryFiltersByType(Ljava/lang/Class;)Ljava/util/List;

Aug 02, 2017 2:44:56 PM org.junit.platform.launcher.core.DefaultLauncher handleThrowable
WARNING: TestEngine with ID 'junit-jupiter' failed to discover tests
java.lang.NoSuchMethodError: org.junit.platform.engine.TestDescriptor.pruneTree()V

Aug 02, 2017 2:44:56 PM org.junit.platform.launcher.core.DefaultLauncher handleThrowable
WARNING: TestEngine with ID 'junit-vintage' failed to discover tests
java.lang.NoSuchMethodError: org.junit.platform.engine.EngineDiscoveryRequest.getDiscoveryFiltersByType(Ljava/lang/Class;)Ljava/util/List;

Note: I have not migrated any tests yet, all are Junit 4 syntax.

like image 505
LazerBanana Avatar asked Aug 02 '17 13:08

LazerBanana


People also ask

How do I create a test runner class in IntelliJ?

Right-click the test root folder or package in the test root folder in which you want to create a new test and select New | Java Class. Name the new class and press Enter . Press Alt+Insert and select Test Method to generate a new test method for this class. Name the new method and press Enter .

Is JUnit5 better than junit4?

Only one test runner can execute tests at a time in JUnit 4 (e.g. SpringJUnit4ClassRunner or Parameterized ). JUnit 5 allows multiple runners to work simultaneously. JUnit 4 never advanced beyond Java 7, missing out on a lot of features from Java 8. JUnit 5 makes good use of the Java 8 features.


4 Answers

The configuration I use is below.

The vintage engine dependency is only required if you are using junit4 tests as well.

The jupiter params is only required if using parameterised tests.

<properties>
    <junit.version>5.0.0</junit.version>
</properties>
...
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-launcher</artifactId>
            <version>1.0.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
            <version>4.12.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
like image 38
sweetfa Avatar answered Oct 21 '22 12:10

sweetfa


Adding specific dependencies solve the problem.

NOTE: UPDATE INTELLIJ ABOVE 2017.2.0 AS THERE WAS A BUG WITH THE JUNIT LAUNCHER

OXYGEN if you using eclipse.


Below dependency enables Junit5 parametrized tests which can be used instead of a DataProvider.

"org.junit.jupiter:junit-jupiter-params:5.0.0"
//for JUnit5 parametrized tests.

Junit5 API.

"org.junit.jupiter:junit-jupiter-api:5.0.0"
//JUnit5 API

Needed if you want to run legacy JUnit4 tests without changing the syntax and imports.

"org.junit.vintage:junit-vintage-engine:4:12.0"
//for legacy JUnit4 tests

EDIT: 07/2018 Match the version of the vintage runner to the jupiter version


Needed if you want to run JUnit5 tests with new syntax and imports.

"org.junit.jupiter:junit-jupiter-engine:5.0.0"
//for JUnit5 tests

java.lang.NoSuchMethodError: org.junit.platform.engine.EngineDiscoveryRequest.getDiscoveryFiltersByType(Ljava/lang/Class;)Ljava/util/List;


Launcher.

"org.junit.platform:junit-platform-launcher:1.0.0
//to handle default launcher

Exception in thread "main" java.lang.NoSuchMethodError: org.junit.platform.commons.util.ReflectionUtils.getDefaultClassLoader()Ljava/lang/ClassLoader;


Additional info how to install JUnit5


Since version 4.6 for Gradle, there is no need for plugins anymore Gradle supports Junit5 natively just do: And the version of the vintage runner is now same as the JUnit 5 version.

dependencies {

    testImplementation "org.junit.jupiter:junit-jupiter-params:$junitVersion"
    testImplementation "org.junit.jupiter:junit-jupiter-api:$junitVersion"

    testRuntimeOnly "org.junit.vintage:junit-vintage-engine:$junitVersion"
    testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junitVersion"
}

test {  
    useJUnitPlatform {
        includeEngines 'junit-jupiter', 'junit-vintage'
    }
}
like image 112
LazerBanana Avatar answered Oct 21 '22 11:10

LazerBanana


I have to change the version of JUnit from 5.4.0 for 5.3.2 and it works like a charm.

like image 17
André Machado Avatar answered Oct 21 '22 13:10

André Machado


I had a problem using IntelliJ and jupiter in a corporate environment. I was able to run 'mvn test', but starting tests in IntelliJ prompts 'IntelliJ failed to resolve junit platform launcher 1.5 2'

Configuring a HTTP Proxy fixed this for me:

Settings -> Appearance & Behavior -> Systems Settings -> HTTP Proxy -> Manual proxy configuration

like image 1
HenrytheVU Avatar answered Oct 21 '22 12:10

HenrytheVU