Getting java.lang.AbstractMethodError when I test using REST Assured

12,386

Solution 1

It turns out that io.rest-assured/spring-mock-mvc dependency was conflicting with io.rest-assured/rest-assured dependency. Once I removed the io.rest-assured/rest-assured from pom.xml, the test worked successfully.

A few years ago when I was using REST Assured version 3.1.1, I could keep both of these dependencies, but perhaps newer versions don't allow this.

Solution 2

Because of rest-assured 4.3.0 upgrade the Groovy from 2.5.7 to 3.0.2, see rest-assured/changelog.txt at master · rest-assured/rest-assured, you can specified the groovy version in pom file.

  <properties>
    <rest-assured.version>4.3.0</rest-assured.version>
    <groovy.version>3.0.2</groovy.version>
  </properties>

Solution 3

It looks like a bug in REST Assured 4.3.0, your code works with 4.2.0 version.

I didn't find opened issue. https://github.com/rest-assured/rest-assured/issues

Solution 4

I used 4.2.0 instead of 4.3.0 .. it works for me

Solution 5

For Maven projects, the code below works well with Spring Boot projects:

<properties>
       <groovy.version>3.0.7</groovy.version>
       <rest-assured.version>4.3.3</rest-assured.version>
   </properties>

   <dependencies>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-test</artifactId>
           <scope>test</scope>
       </dependency>
       <dependency>
           <groupId>io.rest-assured</groupId>
           <artifactId>spring-mock-mvc</artifactId>
           <scope>test</scope>
           <exclusions>
               <exclusion>
                   <artifactId>groovy</artifactId>
                   <groupId>org.codehaus.groovy</groupId>
               </exclusion>
           </exclusions>
       </dependency>
       <dependency>
           <groupId>org.codehaus.groovy</groupId>
           <artifactId>groovy</artifactId>
           <version>${groovy.version}</version>
       </dependency>
       <dependency>
           <groupId>org.codehaus.groovy</groupId>
           <artifactId>groovy-xml</artifactId>
           <version>${groovy.version}</version>
       </dependency>
       <dependency>
           <groupId>org.codehaus.groovy</groupId>
           <artifactId>groovy-json</artifactId>
           <version>${groovy.version}</version>
       </dependency>
       <dependency>
           <groupId>io.rest-assured</groupId>
           <artifactId>json-path</artifactId>
           <version>${rest-assured.version}</version>
           <scope>test</scope>
       </dependency>
       <dependency>
           <groupId>io.rest-assured</groupId>
           <artifactId>xml-path</artifactId>
           <version>${rest-assured.version}</version>
           <scope>test</scope>
       </dependency>
   </dependencies>
```
Share:
12,386
pgngp
Author by

pgngp

Software engineer who loves working with open-source technologies.

Updated on June 07, 2022

Comments

  • pgngp
    pgngp almost 2 years

    I'm trying to test a REST api defined in my controller class using REST Assured v4.3.0, but I get java.lang.AbstractMethodError when I run the test. I understand this error is occurring because I'm calling an abstract method, but I'm having a hard time resolving it.

    It seems that the error is occurring due to .body(is(equalTo("success"))) in SampleControllerTest.java because when I remove this line, the test succeeds. I tried a few things to resolve it, but didn't get any success:

    • Searched online for suggestions and examples, but they are either for older versions or not related to io.rest-assured/spring-mock-mvc
    • Tried different matchers (org.hamcrest.Matchers.* and org.hamcrest.CoreMatchers.*)
    • Tried adding org.hamcrest/hamcrest dependency in the pom file explicitly

    Here's my code for your reference:

    Code structure:

    test
    |- src/
    |  |- main/
    |  |  |- java/
    |  |  |  |- org/
    |  |  |  |  |- example/
    |  |  |  |  |  |- Application.java
    |  |  |  |  |  |- SampleController.java
    |  |- test/
    |  |  |- java/
    |  |  |  |- org/
    |  |  |  |  |- example/
    |  |  |  |  |  |- SampleControllerTest.java
    |- target/
    |- pom.xml
    

    Application.java

    package org.example;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    

    SampleController.java

    package org.example;
    
    import org.springframework.http.HttpStatus;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseStatus;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class SampleController {
        @RequestMapping(value = "/sample")
        @ResponseStatus(value = HttpStatus.OK)
        public String getSample() {
            return "success";
        }
    }
    

    SampleControllerTest.java

    package org.example;
    
    import org.junit.Test;
    
    import static io.restassured.module.mockmvc.RestAssuredMockMvc.*;
    import static org.hamcrest.Matchers.*;
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
    
    public class SampleControllerTest {
        @Test
        public void testGetSample() {
            given()
                .standaloneSetup(new SampleController())
                .when()
                .get("/sample")
                .then()
                .assertThat(status().isOk())
                .body(is(equalTo("success")));
        }
    }
    

    pom.xml

    <?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>
        <packaging>jar</packaging>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.2.1.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <groupId>org.example</groupId>
        <artifactId>test</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <properties>
            <java.version>8</java.version>
            <start-class>org.example.Application</start-class>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!-- JUnit -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/io.rest-assured/spring-mock-mvc -->
            <dependency>
                <groupId>io.rest-assured</groupId>
                <artifactId>spring-mock-mvc</artifactId>
                <version>4.3.0</version>
                <scope>test</scope>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/io.rest-assured/json-path -->
            <dependency>
                <groupId>io.rest-assured</groupId>
                <artifactId>json-path</artifactId>
                <version>4.3.0</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/io.rest-assured/xml-path -->
            <dependency>
                <groupId>io.rest-assured</groupId>
                <artifactId>xml-path</artifactId>
                <version>4.3.0</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/io.rest-assured/rest-assured -->
            <dependency>
                <groupId>io.rest-assured</groupId>
                <artifactId>rest-assured</artifactId>
                <version>4.3.0</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>
    

    When I run the test using mvn test, this is the error I get:

    [ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 1.325 s <<< FAILURE! - in org.example.SampleControllerTest
    [ERROR] testGetSample(org.example.SampleControllerTest)  Time elapsed: 1.288 s  <<< ERROR!
    java.lang.AbstractMethodError: Method io/restassured/internal/ResponseSpecificationImpl.getProperty(Ljava/lang/String;)Ljava/lang/Object; is abstract
            at org.example.SampleControllerTest.testGetSample(SampleControllerTest.java:20)
    

    Thanks for any help in advance!

  • pgngp
    pgngp about 4 years
    That might be true. When I removed the io.rest-assured/rest-assured dependency and kept io.rest-assured/spring-mock-mvc, it worked fine.
  • Igor Ferreira
    Igor Ferreira almost 4 years
    Ops... I do what you do and works too! I change from "io.rest-assured/rest-assured" to io.rest-assured/spring-mock-mvc And add in pom.xml xml <io-rest-assured.version>4.3.0</io-rest-assured.version> <dependency> <groupId>io.rest-assured</groupId> <artifactId>spring-mock-mvc</artifactId> <version>${io-rest-assured.version}</version> <scope>test</scope> </dependency>
  • Igor Ferreira
    Igor Ferreira over 3 years
    Im use resolution above comment by @jörg-pfründer its works for with 4.3.1 version I put in build.gradle this: groovy configurations.all { resolutionStrategy.cacheDynamicVersionsFor 10, "minutes" resolutionStrategy.eachDependency { DependencyResolveDetails details -> if (details.requested.group == 'org.codehaus.groovy') { details.useVersion "3.0.2" details.because "needed by rest-assured>=4.3" } } }
  • Michael Piefel
    Michael Piefel over 3 years
    No, it is not a bug in REST Assured, but in the dependency resolution. Something (Spring in this case) depends on Groovy 2.1.3 (for all artifacts). REST Assured depends on Groovy 3.0.2 (or 3.0.3), but declares only top-level dependencies, not org.codehaus.groovy:groovy itself – Spring wins.
  • Michael Piefel
    Michael Piefel over 3 years
    For Gradle, that would be ext["groovy.version"] = "3.0.3" (Groovy DSL) or extra.apply { set("groovy.version", "3.0.3") } (Kotlin DSL).
  • Michael Piefel
    Michael Piefel over 3 years
    Or, perhaps shorter or more readable: constraints { iplementation("org.codehaus.groovy:groovy:3.0.3") { because("Needed by REST Assured") } }