使用 REST Assured 进行测试时出现 java.lang.AbstractMethodError

pgn*_*ngp 14 java junit maven rest-assured spring-boot

我正在尝试使用 测试在我的控制器类中定义的 REST api REST Assured v4.3.0,但是我java.lang.AbstractMethodError在运行测试时得到了。我知道发生此错误是因为我正在调用一个抽象方法,但我很难解决它。

似乎错误是由于.body(is(equalTo("success")))in发生的,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
Run Code Online (Sandbox Code Playgroud)

应用程序.java

test
|- src/
|  |- main/
|  |  |- java/
|  |  |  |- org/
|  |  |  |  |- example/
|  |  |  |  |  |- Application.java
|  |  |  |  |  |- SampleController.java
|  |- test/
|  |  |- java/
|  |  |  |- org/
|  |  |  |  |- example/
|  |  |  |  |  |- SampleControllerTest.java
|- target/
|- pom.xml
Run Code Online (Sandbox Code Playgroud)

示例控制器.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);
    }
}
Run Code Online (Sandbox Code Playgroud)

示例控制器测试.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";
    }
}
Run Code Online (Sandbox Code Playgroud)

pom.xml

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")));
    }
}
Run Code Online (Sandbox Code Playgroud)

当我使用 运行测试时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)
Run Code Online (Sandbox Code Playgroud)

提前感谢您的任何帮助!

小智 15

因为rest-assured 4.3.0将Groovy从2.5.7升级到3.0.2,参见master·rest-assured/rest-assured的rest-assured/changelog.txt,可以在pom文件中指定groovy版本。

  <properties>
    <rest-assured.version>4.3.0</rest-assured.version>
    <groovy.version>3.0.2</groovy.version>
  </properties>
Run Code Online (Sandbox Code Playgroud)


Yan*_*Yan 8

它看起来像是 REST Assured 4.3.0 中的一个错误,您的代码适用于 4.2.0 版本。

我没有找到打开的问题。https://github.com/rest-assured/rest-assured/issues

  • 不,这不是 REST Assured 中的错误,而是依赖关系解析中的错误。有些东西(本例中为 Spring)依赖于 Groovy 2.1.3(对于所有工件)。REST Assured 依赖于 Groovy 3.0.2(或 3.0.3),但仅声明顶级依赖项,而不是 `org.codehaus.groovy:groovy` 本身 – Spring 获胜。 (2认同)

小智 6

我使用 4.2.0 而不是 4.3.0 ..它对我有用


小智 5

对于 Maven 项目,下面的代码适用于 Spring Boot 项目:

<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>
```
Run Code Online (Sandbox Code Playgroud)


pgn*_*ngp 1

事实证明,io.rest-assured/spring-mock-mvc依赖与io.rest-assured/rest-assured依赖是冲突的。一旦我删除了io.rest-assured/rest-assuredfrom pom.xml,测试就成功了。

几年前,当我使用 REST Assured 版本时3.1.1,我可以保留这两个依赖项,但也许较新的版本不允许这样做。