放心 & Spring - 第一次测试后值变为空

Rest Assured & Spring - Value Becomes Null After First Test

我有一个奇怪的问题。我写了我的 API 我只是想测试一下。

我用Restassured写了一个简单的测试代码:

package com.example.restservicetest;

import io.restassured.RestAssured;
import io.restassured.response.Response;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.web.server.LocalServerPort;

import java.util.*;

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class RestServiceTestApplicationTests {

    @LocalServerPort
    private int port;

    private Response response;
    private List<Object> folderList;

    @Test
    public void getWholeFolders() {
        response = RestAssured.given().port(port).when().get("/api/opening").then().statusCode(200).extract().response();
        folderList= response.jsonPath().getList("folders");
    }

    @Test
    public void getRandomFolderNumber() {
        Random rand = new Random();
        RestAssured.given().port(port).when().get("/api/opening/folder/" + rand.nextInt(folderList.size()-1)).then().statusCode(200);
    }

}

当我调试我的测试时,在第一个 getWholeFolders 测试结束时,我看到 folderList 并不像我预期的那样为空。我的整个文件夹列表正在分配给它。

但是当时间到了第二次测试 getRandomFolderNumber 时,我看到 folderList 变成了 null

为什么会变成null?

正如 Andriy 在评论中提到的,JUnit Jupiter 将使用默认的生命周期模式,这意味着 JUnit 在执行每个测试方法 TestInstance.Lifecycle.PER_METHOD 之前为每个测试创建一个新实例 class。

要更改它,您可以更改 PER_METHOD --> PER_CLASS(基本上意味着所有测试方法的一个测试实例 class)。

一件更微妙的事情,你需要为测试方法设置顺序,以确保 getRandomFolderNumbergetWholeFolders

之后总是 运行
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class RestServiceTestApplicationTests {
    ...

    @Test
    @Order(1)
    public void getWholeFolders() {
        ...
    }

    @Test
    @Order(2)
    public void getRandomFolderNumber() {
        ...
    }

}