Получение java .lang.AbstractMethodError при тестировании с использованием REST Assured - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь проверить REST API, определенный в моем классе контроллера, используя REST Assured v4.3.0, но я получаю java.lang.AbstractMethodError, когда я запускаю тест. Я понимаю, что эта ошибка происходит, потому что я вызываю абстрактный метод, но мне трудно ее решить.

Кажется, что ошибка возникает из-за .body(is(equalTo("success"))) в SampleControllerTest.java, потому что, когда я удаляю эту строку, тест завершается успешно. Я попробовал несколько вещей, чтобы решить эту проблему, но безуспешно:

  • В Интернете искали предложения и примеры, но они либо для более старых версий, либо не связаны с io.rest-assured/spring-mock-mvc
  • Попробовал разные сопоставления (org.hamcrest.Matchers.* и org.hamcrest.CoreMatchers.*)
  • Попытался явно добавить зависимость org.hamcrest/hamcrest в файл pom

Вот мой код для справки:

Структура кода:

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

Приложение. 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")));
    }
}

пом. 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>

Когда я запускаю тест с использованием mvn test, я получаю следующую ошибку:

[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)

Спасибо за любую помощь заранее!

Ответы [ 4 ]

3 голосов
/ 04 апреля 2020

Похоже на ошибку в REST Assured 4.3.0, ваш код работает с версией 4.2.0.

Я не нашел открытой проблемы. https://github.com/rest-assured/rest-assured/issues

0 голосов
/ 06 мая 2020

У меня также был java.lang.AbstractMethodError, но по другому методу.

с уверенностью 4,3 обновил свою реализацию, чтобы использовать groovy 3 , см. примечания к выпуску "Будьте уверены"

В моем случае разрешение зависимостей было понижено до groovy для использования версии 2.x.

Если вы используете maven:

Вы можете проверить это с помощью mvn dependency:tree. Если есть конфликт, добавьте необходимые groovy зависимости как прямые зависимости с версией => 3.0.2 в ваш проект.

Если вы используете gradle:

Вы можете проверить это с помощью gradle depencencies. Если есть конфликт, добавьте стратегию разрешения:

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

Может быть, это кому-нибудь поможет.

0 голосов
/ 20 апреля 2020

Я использовал 4.2.0 вместо 4.3.0 .. у меня работает

0 голосов
/ 04 апреля 2020

Оказывается, зависимость io.rest-assured/spring-mock-mvc конфликтовала с зависимостью io.rest-assured/rest-assured. Как только я удалил io.rest-assured/rest-assured из pom.xml, тест прошел успешно.

Несколько лет go, когда я использовал гарантированную версию REST 3.1.1, я мог сохранить обе эти зависимости, но, возможно, более новые версии не позволяют этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...