J'essaye de tester une API REST définie dans ma classe de contrôleur en utilisant REST Assured v4.3.0
, mais j'obtiens java.lang.AbstractMethodError
lorsque java.lang.AbstractMethodError
le test. Je comprends que cette erreur se produit parce que j'appelle une méthode abstraite, mais j'ai du mal à la résoudre.
Il semble que l'erreur se produise en raison de .body(is(equalTo("success")))
dans SampleControllerTest.java
parce que lorsque je supprime cette ligne, le test réussit. J'ai essayé plusieurs choses pour le résoudre, mais je n'ai obtenu aucun succès:
io.rest-assured/spring-mock-mvc
org.hamcrest.Matchers.*
Et org.hamcrest.CoreMatchers.*
)org.hamcrest/hamcrest
essayé d'ajouter org.hamcrest/hamcrest
dépendance org.hamcrest/hamcrest
dans le fichier pomVoici mon code pour votre référence:
Structure du code:
[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)
Application.java
<?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>
SampleController.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"))); } }
SampleControllerTest.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"; } }
pom.xml
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); } }
Lorsque mvn test
le test à l'aide du test mvn test
, mvn test
l'erreur que j'obtiens:
test |- src/ | |- main/ | | |- java/ | | | |- org/ | | | | |- example/ | | | | | |- Application.java | | | | | |- SampleController.java | |- test/ | | |- java/ | | | |- org/ | | | | |- example/ | | | | | |- SampleControllerTest.java |- target/ |- pom.xml
Merci d'avance pour toute aide!
7 Réponses :
Cela ressemble à un bogue dans REST Assured 4.3.0, votre code fonctionne avec la version 4.2.0.
Je n'ai pas trouvé de problème ouvert. https://github.com/rest-assured/rest-assured/issues
Cela pourrait être vrai. Lorsque j'ai supprimé la io.rest-assured/rest-assured
et conservé io.rest-assured/spring-mock-mvc
, cela a bien fonctionné.
Changer de version de 4.3.0 à 4.2.0 fonctionne pour moi!
Ops ... je fais ce que vous faites et je travaille aussi! Je passe de "io.rest-assuré / repos-assuré" à io.rest-assuré / spring-mock-mvc Et ajoute 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>
Non, ce n'est pas un bogue dans REST Assured, mais dans la résolution des dépendances. Quelque chose (Spring dans ce cas) dépend de Groovy 2.1.3 (pour tous les artefacts). REST Assured dépend de Groovy 3.0.2 (ou 3.0.3), mais ne déclare que les dépendances de niveau supérieur, pas org.codehaus.groovy:groovy
lui-même - Spring gagne.
Il s'avère que la io.rest-assured/spring-mock-mvc
était en conflit avec la dépendance io.rest-assured/rest-assured
. Une fois que j'ai supprimé le io.rest-assured/rest-assured
de pom.xml
, le test a fonctionné avec succès.
Il y a quelques années, lorsque j'utilisais la version 3.1.1
REST Assured, je pouvais conserver ces deux dépendances, mais peut-être que les versions plus récentes ne le permettent pas.
J'ai utilisé 4.2.0 au lieu de 4.3.0 .. cela fonctionne pour moi
Im utiliser la résolution ci-dessus commentaire de @ jörg-pfründer son fonctionne pour avec la version 4.3.1 J'ai mis dans build.gradle ceci: 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" } } }
J'ai également eu un java.lang.AbstractMethodError
mais sur une autre méthode.
Reste assuré 4.3 a mis à niveau son implémentation pour utiliser groovy 3 , voir les notes de publication de soyez assuré
Dans mon cas, la résolution de dépendance a déclassé groovy pour utiliser une version 2.x.
Si vous utilisez maven:
Vous pouvez vérifier cela en utilisant la mvn dependency:tree
. En cas de conflit, ajoutez les dépendances groovy nécessaires en tant que dépendances directes avec une version => 3.0.2 à votre projet.
Si vous utilisez gradle:
Vous pouvez vérifier cela en utilisant des gradle depencencies
. S'il y a un conflit, ajoutez une stratégie de résolution:
configurations.all { resolutionStrategy.eachDependency { DependencyResolveDetails details -> if (details.requested.group == 'org.codehaus.groovy') { details.useVersion "3.0.2" details.because "needed by rest-assured>=4.3" } } }
Peut-être que cela peut aider quelqu'un.
Ou, peut-être plus court ou plus lisible: constraints { iplementation("org.codehaus.groovy:groovy:3.0.3") { because("Needed by REST Assured") } }
En raison de la mise à niveau 4.3.0 rassurée du Groovy de 2.5.7 à 3.0.2, voir repos-assuré / changelog.txt au maître - Soyez assuré / reposé, vous pouvez spécifier la version groovy dans le fichier pom.
<properties> <rest-assured.version>4.3.0</rest-assured.version> <groovy.version>3.0.2</groovy.version> </properties>
Pour Gradle, ce serait ext["groovy.version"] = "3.0.3"
(Groovy DSL) ou extra.apply { set("groovy.version", "3.0.3") }
(Kotlin DSL).
Utilisez ci-dessous la dépendance de soyez assuré dans pom.xml
<dependency> <groupId>io.rest-assured</groupId> <artifactId>rest-assured</artifactId> <version>4.2.0</version> <scope>test</scope> </dependency>
Si vous utilisez Rest Assured version 4.3.2
, spécifiez simplement la version groovy à 3.0.6
et cela corrige l'erreur.
<rest-assured.version>4.3.2</rest-assured.version> <groovy.version>3.0.6</groovy.version>
Bonne chance.