it-source

java.lang을 가져오는 중입니다.REST Assured를 사용하여 테스트할 때 AbstractMethodError가 발생함

criticalcode 2023. 8. 9. 20:49
반응형

java.lang을 가져오는 중입니다.REST Assured를 사용하여 테스트할 때 AbstractMethodError가 발생함

다음을 사용하여 컨트롤러 클래스에 정의된 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

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);
    }
}

샘플 컨트롤러.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";
    }
}

샘플 제어기 검정.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>

다음을 사용하여 테스트를 실행할 때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)

미리 도와주셔서 감사합니다!

Groovy는 2.5.7에서 3.0.2로 업그레이드되므로 rest-assure/변경 로그를 참조하십시오.txt at master · rest-filename/rest-filename에서 groovy 버전을 pom 파일로 지정할 수 있습니다.

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

REST Assured 4.3.0의 버그인 것 같습니다. 코드는 4.2.0 버전에서 작동합니다.

열려 있는 이슈를 찾지 못했습니다.https://github.com/rest-assured/rest-assured/issues

4.3.0 대신 4.2.0을 사용했습니다.저한테는 효과가 있어요.

메이븐 프로젝트의 경우 아래 코드가 스프링 부트 프로젝트와 잘 작동합니다.

<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>
```

저는 또한.java.lang.AbstractMethodError하지만 다른 방법으로.

rest-patcher 4.3 업그레이드 그루비 3을 사용하는 구현, restaired의 릴리스 노트를 참조하십시오.

이 경우 종속성 해결은 그루비를 다운그레이드하여 일부 2.x 버전을 사용합니다.

메이븐을 사용하는 경우:

다음을 사용하여 확인할 수 있습니다.mvn dependency:tree충돌이 있는 경우 필요한 그루비 종속성을 버전=>3.0.2의 직접 종속성으로 프로젝트에 추가합니다.

그라들을 사용하는 경우:

다음을 사용하여 확인할 수 있습니다.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"
        }
    }
}

누군가에게 도움이 될 수도 있습니다.

pom.xml에서 resecured의 의존성을 아래와 같이 사용합니다.

    <dependency>
        <groupId>io.rest-assured</groupId>
        <artifactId>rest-assured</artifactId>
        <version>4.2.0</version>
        <scope>test</scope>
    </dependency>

Rest Assured 버전을 사용하는 경우4.3.2그루비 버전을 명시적으로 지정하십시오.3.0.6그러면 오류가 해결됩니다.

<rest-assured.version>4.3.2</rest-assured.version>
<groovy.version>3.0.6</groovy.version>

행운을 빌어요.

알고 보니io.rest-assured/spring-mock-mvc종속성이 충돌했습니다.io.rest-assured/rest-assured의존.일단 제가 그것을 제거했을 때io.rest-assured/rest-assuredpom.xml테스트가 성공적으로 작동했습니다.

몇 년 전 REST Assured 버전을 사용했을 때3.1.1이러한 종속성을 모두 유지할 수는 있지만 최신 버전에서는 이를 허용하지 않을 수 있습니다.

언급URL : https://stackoverflow.com/questions/61020200/getting-java-lang-abstractmethoderror-when-i-test-using-rest-assured

반응형