8
votes

Obtenir java.lang.AbstractMethodError lorsque je teste à l'aide de REST Assured

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:

  • Recherche en ligne de suggestions et d'exemples, mais ils concernent des versions plus anciennes ou ne sont pas liés à io.rest-assured/spring-mock-mvc
  • J'ai essayé différents matchers ( org.hamcrest.Matchers.* Et org.hamcrest.CoreMatchers.* )
  • org.hamcrest/hamcrest essayé d'ajouter org.hamcrest/hamcrest dépendance org.hamcrest/hamcrest dans le fichier pom

Voici 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!


0 commentaires

7 Réponses :


7
votes

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


4 commentaires

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.



0
votes

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.


0 commentaires

3
votes

J'ai utilisé 4.2.0 au lieu de 4.3.0 .. cela fonctionne pour moi


1 commentaires

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" } } }



3
votes

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.


1 commentaires

Ou, peut-être plus court ou plus lisible: constraints { iplementation("org.codehaus.groovy:groovy:3.0.3") { because("Needed by REST Assured") } }



8
votes

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>


1 commentaires

Pour Gradle, ce serait ext["groovy.version"] = "3.0.3" (Groovy DSL) ou extra.apply { set("groovy.version", "3.0.3") } (Kotlin DSL).



0
votes

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>


0 commentaires

0
votes

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.


0 commentaires