3
Exception in thread "main" java.lang.NoClassDefFoundError: 
org/junit/runner/JUnitCore
    at springbook.learningtest.junit.JUnitTest.main(JUnitTest.java:7)
Caused by: java.lang.ClassNotFoundException: org.junit.runner.JUnitCore
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 1 more

I found similar error in java.lang.NoClassDefFoundError in junit . But I already added junit to my project with maven. Then, I checked Maven Dependencies and found there was junit-4.12.jar. I tried some different version of junit and spring, but all my attempts were failed. Below I attached My codes.

<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>TobySpring3.1</groupId>
    <artifactId>TobySpring3.1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <build>
        <sourceDirectory>src</sourceDirectory>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.1</version>
                <configuration>
                    <source />
                    <target />
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <!-- MySQL -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.45</version>
        </dependency>
        <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>3.1.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-instrument</artifactId>
            <version>3.1.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>3.1.4.RELEASE</version>
        </dependency>
        <!-- JUNIT -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-library</artifactId>
            <version>1.3</version>
            <scope>test</scope>
        </dependency>
        <!-- CGLIB -->
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>2.2.2</version>
        </dependency>
    </dependencies>
</project>

Above is my pom.xml

package springbook.learningtest.junit;

import org.junit.runner.JUnitCore;

public class JUnitTest {
    public static void main(String[] args) {
        JUnitCore.main("springbook.user.test.UserDaoTest");
    }
}

.

package springbook.user.test;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

import java.sql.SQLException;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

import springbook.user.dao.UserDao;
import springbook.user.domain.User;

public class UserDaoTest {

    @Test
    public void addAndGet() throws ClassNotFoundException, SQLException {
        ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");
        UserDao dao = context.getBean("userDao", UserDao.class);

        User user = new User();
        user.setId("gyumee");
        user.setName("name");
        user.setPassword("password");

        dao.add(user);

        User user2 = dao.get(user.getId());

        assertThat(user2.getName(), is(user.getName()));
        assertThat(user2.getPassword(), is(user.getPassword()));
    }
}
applemango
  • 123
  • 1
  • 9
  • 2
    Why do you use an extra starter class for your JUnit test? You're using Maven anyway and if your test class is located in `/src/test/java/springbook/user/test` the [Surefire plugin](https://maven.apache.org/surefire/maven-surefire-plugin/), bound to the `test` phase, runs methods annotated with `@Test` with `mvn test` (or any subsequent phase) anyway. – Gerold Broser Feb 03 '18 at 17:05

4 Answers4

1

Surprisingly i was also facing same error log, adding these hamcrest-core solved the issue in my case.

<!-- https://mvnrepository.com/artifact/org.hamcrest/hamcrest-core -->
<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-core</artifactId>
    <version>1.3</version>
    <scope>test</scope>
</dependency>

from Here.

Ratul Sharker
  • 7,484
  • 4
  • 35
  • 44
1

When I changed junit to 4.7 with maven, it stil didn't work. I checked Maven Dependencies and there was junit-4.7.jar. Still same error messeage. I added junit-4.7.jar in Java Build Path again (See below image)

enter image description here

Then, it worked well! But, still I don't know why this problem happened ;( . Does anyone know why?

applemango
  • 123
  • 1
  • 9
1

I am even getting the same error as Exception in thread "main" java.lang.NoClassDefFoundError: org/junit/runner/JUnitCore

What I am basically trying here is to run the JUnit tests directly calling the executable jar file (of my application). When I run the application in my local it works expected and main is called along with test execution happens

public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
        System.out.println("Starting Integration Tests!");
        JUnitCore engine = new JUnitCore();
        engine.run(test.class);
    }

This calls the test class and runs all the desired tests but then when I try to execute the jar from the command line as below it fails C:\Users\tripate\eclipse\testing\target>java -jar testing-0.0.1-SNAPSHOT.jar Hello World! Starting Integration Tests!

    Exception in thread "main" java.lang.NoClassDefFoundError: org/junit/runner/JUnitCore
        at MVP2.testing.App.main(App.java:15)
Caused by: java.lang.ClassNotFoundException: org.junit.runner.JUnitCore
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)

Note: The jar is generated as the part of maven build here. I have both JUnit and hamcrest dependency in my POM file

1

you are running the test classes through test suite which run as java application not as test. In pom for junit dependency remove scope "test", as scope is defined as test that's why test suite not able to find JUnit class.

 <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
    </dependency>