1

Im working on restful application. At the beginning I used TDD methodology. On the second stage I switch to the option: tests after implemented methods. But I cannot run a test. Type of error:

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

    at org.junit.platform.launcher.core.ServiceLoaderTestEngineRegistry.loadTestEngines(ServiceLoaderTestEngineRegistry.java:30)

    at org.junit.platform.launcher.core.LauncherFactory.create(LauncherFactory.java:53)

    at com.intellij.junit5.JUnit5IdeaTestRunner.createListeners(JUnit5IdeaTestRunner.java:39)

    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:49)

    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)

    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

Process finished with exit code 1

Empty test suite.

POM file:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.przemyslawostrouch</groupId>
    <artifactId>weatherapp</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>weatherapp</name>
    <description>Web project will aviation weather and Notam informations</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.assertj/assertj-core -->
        <dependency>
            <groupId>org.assertj</groupId>
            <artifactId>assertj-core</artifactId>
            <version>1.2.0</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.opencsv</groupId>
            <artifactId>opencsv</artifactId>
            <version>3.9</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>RELEASE</version>
        </dependency><!-- https://mvnrepository.com/artifact/org.json/json -->
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20170516</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-io -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-io</artifactId>
            <version>1.3.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.1</version>
        </dependency>


        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.16</version>
            <scope>provided</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.squareup.retrofit/retrofit -->
        <dependency>
            <groupId>com.squareup.retrofit</groupId>
            <artifactId>retrofit</artifactId>
            <version>1.9.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

Test class example:

    package com.przemyslawostrouch.parsers;

import com.przemyslawostrouch.domain.Airport;
import com.przemyslawostrouch.domain.City;
import com.przemyslawostrouch.domain.CityAirportDistance;
import com.przemyslawostrouch.logic.NearestAirport;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;


/**
 * Created by Przemek on 2017-06-24.
 */
class NearestAirportTest {

    private NearestAirport nearestAirport;
    private City katowiceCity;
    private Airport katowiceAirport;
    private Airport frankfurtAirport;
    private Airport pulkovoAirport;
    private CityAirportDistance cityAirportDistance;
    private CityAirportDistance cityAirportDistance1;
    private CityAirportDistance cityAirportDistance2;
    private String searchedCityUpperCase;

    public void setup() {


        searchedCityUpperCase = "Katowice";

        nearestAirport = new NearestAirport();

        katowiceCity = City.builder()
                .name("Katowice")
                .latitude(50.26489189999999)
                .longitude(19.0237815)
                .build();

        katowiceAirport = Airport.builder()
                .name("Muchowiec Airport")
                .longitude(19.03420066833496)
                .latitude(50.23809814453125)
                .build();

        frankfurtAirport = Airport.builder()
                .name("Frankfurt am Main International Airport")
                .longitude(8.5705556)
                .latitude(50.0333333)
                .build();

        pulkovoAirport = Airport.builder()
                .name("Pulkovo Airport")
                .longitude(30.262500762939453)
                .latitude(59.80030059814453)
                .build();

        cityAirportDistance = CityAirportDistance.builder()
                .airportName(katowiceAirport.getName())
                .searchedCityName(searchedCityUpperCase)
                .distanceBetweenSearchedCityAndAirport(1.6565764398773335)
                .build();

        cityAirportDistance1 = CityAirportDistance.builder()
                .airportName(frankfurtAirport.getName())
                .searchedCityName(searchedCityUpperCase)
                .distanceBetweenSearchedCityAndAirport(401.81041784523916)
                .build();

        cityAirportDistance2 = CityAirportDistance.builder()
                .airportName(pulkovoAirport.getName())
                .searchedCityName(searchedCityUpperCase)
                .distanceBetweenSearchedCityAndAirport(688.4011751978946)
                .build();
    }

    @Test
    void isNearestAirportNotNull() {
        setup();
        assertThat(nearestAirport).isNotNull();
    }

    @Test
    void whenTypedCityReturnCityWithFirstLetterUpperCase() {
        setup();
        String searchedCity = "katowice";
        assertThat(nearestAirport.searchedCityToUpperCase(searchedCity)).isEqualTo("Katowice");
    }


    @Test
    void forGivenCityAndAerodromeCoordinatesReturnDistance() {
        setup();
        //City Gdansk
        City gdanskCity = City.builder()
                .name("Gdansk")
                .latitude(54.35202520000001)
                .longitude(18.6466384)
                .build();
        Airport gdanskAirport = Airport.builder()
                .name("Gdańsk Lech Wałęsa Airport")
                .latitude(54.377601623535156)
                .longitude(18.46619987487793)
                .build();

        assertThat(nearestAirport.calculateDistance(gdanskCity, gdanskAirport)).isEqualTo(6.491638306515884);
    }

    @Test
    void forGivenCityNameCalculateDistanceBetweenAllAirports() {
        setup();
        List<Airport> listOfAirportsForTest = new ArrayList<>();

        listOfAirportsForTest.add(katowiceAirport);
        listOfAirportsForTest.add(frankfurtAirport);
        listOfAirportsForTest.add(pulkovoAirport);


        assertThat(nearestAirport.calculateDistanceBetweenAllAirportsAndSelectedCity(listOfAirportsForTest, katowiceCity))
                .contains(cityAirportDistance, cityAirportDistance1, cityAirportDistance2);

    }

    @Test
    void sortListDistancesAndReturnNearestAirport() {
        setup();

        List<CityAirportDistance> cityAirportDistancesListTest = new ArrayList<>();


        cityAirportDistancesListTest.add(cityAirportDistance);
        cityAirportDistancesListTest.add(cityAirportDistance1);
        cityAirportDistancesListTest.add(cityAirportDistance2);

        assertThat(nearestAirport.createListOfNearestAirports(katowiceCity)).contains(cityAirportDistancesListTest.get(0)
                , cityAirportDistancesListTest.get(1)
                , cityAirportDistancesListTest.get(2));

    }

I tried change dependencies, delete these tests and write another, it doesn't work. I have never met this error, cannot run any test in this project. I cannot find the solution of this problem on stack overflow and similar pages. if you need any addition information just ask, thanks for help

2 Answers 2

5

The answer is in your pom.xml file. If you take a look at the console output you will find that IntelliJ IDEA is trying to use JUnit5 runner:

at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:43)

According to your pom.xml file you expect to use JUnit:4.12. Next step is to find which dependency causes this conflict. Comparing all dependencies listed in pom.xml you can find junit-jupiter-api

    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>RELEASE</version>
    </dependency>

This module is designed for JUnit5 - https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api

Also correct the import of @Test annotation in your test class - you're importing one from jupiter api.

EDIT: Last one thing. When you face similar issues (e.g.classloader complains about non-existing methods reference) using Maven's dependency plugin is always a good starting point (https://maven.apache.org/plugins/maven-dependency-plugin/examples/resolving-conflicts-using-the-dependency-tree.html). It will help you in finding which dependency causes conflict.

Sign up to request clarification or add additional context in comments.

Comments

1

This was a nightmare issue even for someone who used IntelliJ for 8 or so years. Maven build was clean but somehow IntelliJ was using an old cached dependency during runtime.

I had to reimport each of the submodule (I have a couple of nested ones) to get this working. Right Click on the project and select Maven->Reimport

Below were my failed attempts/debugging, just in case if people haven't tried. Hoping some of these could help others.

  1. mvn clean -Dtest=V1RequestMapperTest test so from command line test worked fine so something wrong with IntelliJ
  2. Invalidate Cache
  3. Invalidate Cache and Restart
  4. Deleted offending dependency from .m2 folder to bring new

1 Comment

running clean in the Maven sidebar and then running test resolved this issue for me.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.