Getting java.lang.AbstractMethodError when I test using REST Assured
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>
```
pgngp
Software engineer who loves working with open-source technologies.
Updated on June 07, 2022Comments
-
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 getjava.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")))
inSampleControllerTest.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.*
andorg.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!
- Searched online for suggestions and examples, but they are either for older versions or not related to
-
pgngp about 4 yearsThat might be true. When I removed the
io.rest-assured/rest-assured
dependency and keptio.rest-assured/spring-mock-mvc
, it worked fine. -
Igor Ferreira almost 4 yearsOps... 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 over 3 yearsIm 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 over 3 yearsNo, 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 over 3 yearsFor Gradle, that would be
ext["groovy.version"] = "3.0.3"
(Groovy DSL) orextra.apply { set("groovy.version", "3.0.3") }
(Kotlin DSL). -
Michael Piefel over 3 yearsOr, perhaps shorter or more readable:
constraints { iplementation("org.codehaus.groovy:groovy:3.0.3") { because("Needed by REST Assured") } }