放心 & 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)。
一件更微妙的事情,你需要为测试方法设置顺序,以确保 getRandomFolderNumber
在 getWholeFolders
之后总是 运行
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class RestServiceTestApplicationTests {
...
@Test
@Order(1)
public void getWholeFolders() {
...
}
@Test
@Order(2)
public void getRandomFolderNumber() {
...
}
}
我有一个奇怪的问题。我写了我的 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)。
一件更微妙的事情,你需要为测试方法设置顺序,以确保 getRandomFolderNumber
在 getWholeFolders
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class RestServiceTestApplicationTests {
...
@Test
@Order(1)
public void getWholeFolders() {
...
}
@Test
@Order(2)
public void getRandomFolderNumber() {
...
}
}