0

I'm trying to add unit testing of ReST calls using JerseyTest framework in my project. I've copy-pasted a most trivial example, but I get a run-time exception:

java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map;
 at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:298)
 at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:272)
 at org.glassfish.jersey.test.JerseyTest.<init>(JerseyTest.java:142)
 at com.dfc.warroom.rest.SimpleTest.<init>(SimpleTest.java:19)
 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
 at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
 at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
 at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
 at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:187)
 at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:236)
 at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
 at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:233)
 at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
 at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
 at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
 at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
 at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
 at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
 at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
 at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
 at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
 at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:74)
 at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211)
 at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
 at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

Attaching the code and pom dependencies:

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Application;

import static junit.framework.Assert.assertEquals;


public class SimpleTest extends JerseyTest {

    @Path("hello")
    public static class HelloResource {
        @GET
        public String getHello() {
            return "Hello World!";
        }
    }

    @Override
    protected Application configure() {
        return new ResourceConfig(HelloResource.class);
    }

    @Test
    public void test() {
        final String hello = target("hello").request().get(String.class);
        assertEquals("Hello World!", hello);
    }
}

 <dependencies>
        <dependency>
            <groupId>com.dfc</groupId>
            <artifactId>war-room</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <!-- if your container implements Servlet API older than 3.0, use "jersey-container-servlet-core"  -->
            <artifactId>jersey-container-servlet</artifactId>
            <version>2.6</version>
        </dependency>

        <!-- Required only when you are using JAX-RS Client -->
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-client</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.jaxrs</groupId>
            <artifactId>jackson-jaxrs-json-provider</artifactId>
            <version>2.3.0</version>
        </dependency>


        <!-- Testing -->

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>1.9.5</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.glassfish.jersey.test-framework.providers</groupId>
            <artifactId>jersey-test-framework-provider-jetty</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-server</artifactId>
            <version>1.18.1</version>
        </dependency>
        <dependency>
            <groupId>com.eclipsesource.jaxrs</groupId>
            <artifactId>jersey-all</artifactId>
            <version>2.8</version>
        </dependency>

    </dependencies>
Olga Brukman
  • 11
  • 1
  • 3
  • Get rid of `jersey-server` and `jersey-all` and see what happens. You seem to be mixing a bunch of version dependencies. NoSuchMethodError is a common result of doing that. Haven't tried it, but I'm thinking that's where the problem is. – Paul Samsotha Jan 25 '15 at 13:58
  • I've removed jersey-server and jersey-all, changed jersey dependencies version to be the latest (2.15), Now I get a new exception: `java.lang.NoClassDefFoundError: org/eclipse/jetty/server/HttpConfiguration$Customizer` even though I've added jetty dependencies: ` org.eclipse.jetty jetty-server 9.3.0.M1 ` – Olga Brukman Jan 26 '15 at 15:21

3 Answers3

1

As already said, this error is due to a conflict in your dependencies (probably between jersey 1 and 2). More information here. In fact, you use the version 1.18 of jersey-server, and other versions 2.6 in your pom.xml.

Community
  • 1
  • 1
Guillaume
  • 694
  • 1
  • 6
  • 15
  • I've removed jersey-server and jersey-all, changed jersey dependencies version to be the latest (2.15), Now I get a new exception: `java.lang.NoClassDefFoundError: org/eclipse/jetty/server/HttpConfiguration$Customizer` even though I've added jetty dependencies: ` org.eclipse.jetty jetty-server 9.3.0.M1 ` – Olga Brukman Jan 26 '15 at 15:27
1

Solved by removing jersey-server and jersey-all dependencies, updating jersey dependencies to the latest version (2.15) and adding jetty dependencies.

Olga Brukman
  • 11
  • 1
  • 3
0

I had the same issue I was getting this library transitively:
org.glassfish.jersey.media:jersey-media-json-jackson:jar:2.14

All of my jersey libs where version 2.6, excluding the above made my test cases pass. I add this:

         <exclusion>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-jackson</artifactId>
         </exclusion>
        </exclusions>
SQLiteNoob
  • 2,958
  • 3
  • 29
  • 44
darniz
  • 21
  • 4