CookiesManager.java、DBuser.java、login.java、register.java和User.java。validateUser.java和Util.javam没有发生变化。
请对下面Java代码产生JUnit5的测试用例
import javax.servlet.http.Cookie;
import
javax.servlet.http.HttpServletResponse;
import
javax.servlet.http.HttpServletRequest;
public class CookiesManager {
private
HttpServletResponse response;
private
HttpServletRequest request;
private
String cookies_name;
private
String cookies_value;
// 构造函数,接受 cookies 和
response 对象
public CookiesManager(String cookies_name,String cookies_value,
HttpServletResponse response,HttpServletRequest request) {
this.cookies_name = cookies_name;
this.cookies_value = cookies_value;
this.response = response;
this.request = request;
}
public CookiesManager(String cookies_name, HttpServletResponse
response,HttpServletRequest request) {
this.cookies_name = cookies_name;
this.response = response;
this.request = request;
}
// 设置cookies的方法
public void setCookie() {
if (this.cookies_value != null && !this.cookies_value.isEmpty())
{
// 创建一个新的 Cookie
Cookie myCookie = new Cookie(this.cookies_name, this.cookies_value);
// 设置 Cookie 的有效期为 1 天(单位是秒)
myCookie.setMaxAge(60 * 60 * 24);
// 设置 Cookie 的路径
myCookie.setPath("/");
// 如果使用 HTTPS,确保 Cookie 只通过安全连接发送
myCookie.setSecure(true);
// 防止客户端脚本访问 Cookie
myCookie.setHttpOnly(true);
// 将 Cookie 添加到响应中
response.addCookie(myCookie);
} else {
// 处理cookies为空的情况
System.out.println("cookie is null or empty.");
}
}
// 获取cookies的方法
public String getCookie() {
Cookie[] cookies =
this.request.getCookies(); // 获取所有的cookies
if
(cookies != null) {
for
(Cookie cookie : cookies) {
String
name = cookie.getName(); // 获取cookie的名称
String
value = cookie.getValue(); // 获取cookie的值
if
(name.equals(this.cookies_name)
&&(value!=null)||(value.equals(""))){
this.cookies_value=value;
}
}
}
return
this.cookies_value;
}
}
package ebusiness;
import java.sql.*;
public class DBuser {
private static final String url = "jdbc:mysql://localhost:3306/ebusiness";
private static final String user = "root";
private static final String password = "123456";
private static Statement stmt = null;
private static ResultSet rs;
public Connection connect() throws SQLException {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, user, password);
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
return conn;
} catch (ClassNotFoundException e) {
System.out.println("JDBC Driver not found: " + e.getMessage());
} catch (SQLException e) {
System.out.println("Database connection failed: " + e.getMessage());
}
return null;
}
public void disconnect(Connection conn) {
try {
if (rs != null) {
rs.close();
}
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public String insert(Connection conn, User user) throws SQLException {
if (!userExists(conn, user.getUsername(), user.getEmail(), user.getPhone()).equals("0")) {
return userExists(conn, user.getUsername(), user.getEmail(), user.getPhone());
}
String insertString = "INSERT INTO user (username, password, phone, email) VALUES (?, ?, ?, ?)";
try {
PreparedStatement stmt = conn.prepareStatement(insertString);
stmt.setString(1, user.getUsername());
stmt.setString(2, user.getPassword());
stmt.setString(3, user.getPhone());
stmt.setString(4, user.getEmail());
int affectedRows = stmt.executeUpdate();
return String.valueOf(affectedRows);
} catch (SQLException e) {
e.printStackTrace();
}
return "-1";
}
public String userExists(Connection conn, String username, String email, String phone) throws SQLException {
if (!judgeInfo(conn,"username",username).equals("0"))
return "注册用户的用户名必须唯一";
else if(!judgeInfo(conn,"phone",phone).equals("0"))
return "注册用户的手机必须唯一";
else if(!judgeInfo(conn,"email",email).equals("0"))
return "注册用户的邮箱必须唯一";
else
return "0";
}
public String judgeInfo(Connection conn, String field,String value) throws SQLException {
String queryString = “SELECT * FROM user WHERE “+field+” = ?”;
try {
PreparedStatement stmt = conn.prepareStatement(queryString);
stmt.setString(1, value);
ResultSet rs = stmt.executeQuery();
if(rs.next())
return field;
} catch (SQLException e) {
e.printStackTrace();
}
return "0";
}
public String login(Connection conn, User user) throws SQLException {
String username=user.getUsername();
String password=user.getPassword();
PreparedStatement stmt = null;
ResultSet rs = null;
try {
String queryString = "SELECT * FROM user WHERE username=? AND password=?";
stmt = conn.prepareStatement(queryString);
stmt.setString(1, username);
stmt.setString(2, password);
rs = stmt.executeQuery();
if (!rs.next()) {
return "0";
} else {
return "1";
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return "-1";
}
}
11.1.3 login.java
package ebusiness;
import java.sql.Connection;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletRequest;
public class login {
private HttpServletResponse response;
private HttpServletRequest request;
public login(HttpServletResponse response,HttpServletRequest request) {
this.response = response;
this.request = request;
}
public String myLogin() {
String username = request.getParameter("username");
String password = request.getParameter("password");
User user = new User(username, password);
validateUser ValidateUser = new validateUser();
String validationResult = ValidateUser.validate(user);
if (validationResult.equals("验证成功")) {
try {
DBuser mysql = new DBuser();
Connection conn = mysql.connect();
if (mysql.login(conn, user).equals("0")){
return "用户名或密码错误";
}else{
CookiesManager myusername = new CookiesManager("username",username, response,request);
myusername.setCookie();
response.sendRedirect("welcome.jsp");
}
mysql.disconnect(conn);
} catch (Exception e) {
e.printStackTrace();
}
}else{
return validationResult;
}
return "0";
}
}
package ebusiness;
import java.sql.Connection;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletRequest;
public class register {
private HttpServletResponse response;
private HttpServletRequest request;
public register(HttpServletResponse response,HttpServletRequest request) {
this.response = response;
this.request = request;
}
public String myRegister() {
String username = this.request.getParameter("username");
String password = this.request.getParameter("password");
String phone = this.request.getParameter("phone");
String email = this.request.getParameter("email");
User user = new User(username,password,phone,email);
validateUser ValidateUser = new validateUser();
String validationResult = ValidateUser.validate(user);
if (!validationResult.equals("验证成功")) {
return validationResult;
}else {
try {
DBuser mysql = new DBuser();
Connection conn = mysql.connect();
String info = mysql.insert(conn, user);
if (info.equals("1")) {
this.response.sendRedirect("login.jsp");
} else {
return info;
}
mysql.disconnect(conn);
} catch (Exception e) {
return "数据库错误: " + e.getMessage();
}
}
return "0";
}
}
11.1.5 User.java
package ebusiness;
public class User {
private int id;
private String username;
private String password;
private String phone;
private String email;
public User(String username,String password) {
this.username = username;
this.password = password;
this.phone = "13611112222";
this.email = "jerry@126.com";
}
public User(String username,String password,String phone,String email) {
this.username = username;
this.password = password;
this.phone = phone;
this.email = email;
}
// Getters and Setters
public int getId() {
return id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
11.2登录产品Java文件的单元测试用例回复
下面是为您提供的Java代码编写的JUnit 5测试用例。这些测试用例涵盖了CookiesManager、DBuser、login、register和User类的基本功能。请确保您已经添加了JUnit 5依赖项到您的项目中。
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class CookiesManagerTest {
private HttpServletResponse response;
private HttpServletRequest request;
private CookiesManager cookiesManager;
@BeforeEach
public void setUp() {
response = mock(HttpServletResponse.class);
request = mock(HttpServletRequest.class);
}
@Test
public void testSetCookie() {
cookiesManager = new CookiesManager("testCookie", "testValue", response, request);
cookiesManager.setCookie();
Cookie[] cookies = new Cookie[1];
cookies[0] = new Cookie("testCookie", "testValue");
when(response.getCookies()).thenReturn(cookies);
verify(response).addCookie(any(Cookie.class));
}
@Test
public void testGetCookie() {
Cookie cookie = new Cookie("testCookie", "testValue");
Cookie[] cookies = { cookie };
when(request.getCookies()).thenReturn(cookies);
cookiesManager = new CookiesManager("testCookie", response, request);
String value = cookiesManager.getCookie();
assertEquals("testValue", value);
}
@Test
public void testSetCookieWithNullValue() {
cookiesManager = new CookiesManager("testCookie", null, response, request);
cookiesManager.setCookie();
verify(response, never()).addCookie(any(Cookie.class));
}
}
运行
testSetCookie() 方法when(response.getCookies()).thenReturn(cookies);
报
The method getCookies() is undefined for the type HttpServletResponse
错误,询问ChatGPT
您是正确的,HttpServletResponse接口并没有定义getCookies()方法。相反,getCookies()方法是HttpServletRequest的一部分。因此,您在测试中对HttpServletResponse的模拟不需要调用getCookies()。
以下是修正后的CookiesManagerTest类,去掉了对response.getCookies()的调用,并确保测试逻辑正确:
修正后的 CookiesManagerTest.java
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class CookiesManagerTest {
private HttpServletResponse response;
private HttpServletRequest request;
private CookiesManager cookiesManager;
@BeforeEach
public void setUp() {
response = mock(HttpServletResponse.class);
request = mock(HttpServletRequest.class);
}
@Test
public void testSetCookie() {
cookiesManager = new CookiesManager("testCookie", "testValue", response, request);
cookiesManager.setCookie();
// 验证是否添加了Cookie
Cookie myCookie = new Cookie("testCookie", "testValue");
verify(response).addCookie(myCookie);
}
@Test
public void testGetCookie() {
Cookie cookie = new Cookie("testCookie", "testValue");
Cookie[] cookies = { cookie };
when(request.getCookies()).thenReturn(cookies);
cookiesManager = new CookiesManager("testCookie", response, request);
String value = cookiesManager.getCookie();
assertEquals("testValue", value);
}
@Test
public void testSetCookieWithNullValue() {
cookiesManager = new CookiesManager("testCookie", null, response, request);
cookiesManager.setCookie();
verify(response, never()).addCookie(any(Cookie.class));
}
@Test
public void testGetCookieWhenNotFound() {
Cookie[] cookies = {};
when(request.getCookies()).thenReturn(cookies);
cookiesManager = new CookiesManager("testCookie", response, request);
String value = cookiesManager.getCookie();
assertNull(value);
}
}
说明
lsetCookie测试: 验证是否调用了response.addCookie()方法,并传入了正确的Cookie对象。
lgetCookie测试: 如果请求中包含指定名称的Cookie,验证返回的值是否正确。
lsetCookieWithNullValue测试: 验证当Cookie值为null时,addCookie方法不会被调用。
lgetCookieWhenNotFound测试: 测试当请求中没有Cookie时,返回的值应为null。
请更新您的测试代码并运行以确保一切正常。如果您有其他问题或需要进一步的帮助,请随时告诉我!
运行testSetCookie()仍旧报错,再次询问ChatGPT
@Test
public void testSetCookie() {
cookiesManager = new CookiesManager("testCookie", "testValue", response, request);
cookiesManager.setCookie();
// 验证是否添加了Cookie
Cookie myCookie = new Cookie("testCookie", "testValue");
verify(response).addCookie(myCookie);
}
报
Argument(s) are different! Wanted:
httpServletResponse.addCookie(
javax.servlet.http.Cookie@7dcc91fd
);
-> at ebusiness.CookiesManagerTest.testSetCookie(CookiesManagerTest.java:30)
Actual invocations have different arguments:
httpServletResponse.addCookie(
javax.servlet.http.Cookie@66eb985d
);
-> at ebusiness.CookiesManager.setCookie(CookiesManager.java:41)
…
回答
这个错误提示是因为在验证response.addCookie()方法时,您期望的Cookie对象与实际传递的Cookie对象不匹配。这个问题通常是因为在Mockito中,默认情况下,比较对象的引用,而不是其内容。
为了解决这个问题,您可以使用ArgumentCaptor来捕获传递给addCookie方法的Cookie对象,并验证它的属性,而不是直接比较对象。以下是修改后的testSetCookie方法的示例:
修改后的 testSetCookie 方法
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
public class CookiesManagerTest {
private HttpServletResponse response;
private HttpServletRequest request;
private CookiesManager cookiesManager;
@BeforeEach
public void setUp() {
response = mock(HttpServletResponse.class);
request = mock(HttpServletRequest.class);
}
@Test
public void testSetCookie() {
cookiesManager = new CookiesManager("testCookie", "testValue", response, request);
cookiesManager.setCookie();
// 使用ArgumentCaptor捕获传递的Cookie对象
ArgumentCaptor<Cookie> cookieCaptor = ArgumentCaptor.forClass(Cookie.class);
verify(response).addCookie(cookieCaptor.capture());
// 验证捕获的Cookie对象的属性
Cookie capturedCookie = cookieCaptor.getValue();
assertEquals("testCookie", capturedCookie.getName());
assertEquals("testValue", capturedCookie.getValue());
assertEquals(60 * 60 * 24, capturedCookie.getMaxAge());
assertEquals("/", capturedCookie.getPath());
assertTrue(capturedCookie.getSecure());
assertTrue(capturedCookie.isHttpOnly());
}
@Test
public void testGetCookie() {
Cookie cookie = new Cookie("testCookie", "testValue");
Cookie[] cookies = { cookie };
when(request.getCookies()).thenReturn(cookies);
cookiesManager = new CookiesManager("testCookie", response, request);
String value = cookiesManager.getCookie();
assertEquals("testValue", value);
}
@Test
public void testSetCookieWithNullValue() {
cookiesManager = new CookiesManager("testCookie", null, response, request);
cookiesManager.setCookie();
verify(response, never()).addCookie(any(Cookie.class));
}
@Test
public void testGetCookieWhenNotFound() {
Cookie[] cookies = {};
when(request.getCookies()).thenReturn(cookies);
cookiesManager = new CookiesManager("testCookie", response, request);
String value = cookiesManager.getCookie();
assertNull(value);
}
}
说明
lArgumentCaptor: 使用ArgumentCaptor来捕获传递给addCookie方法的Cookie对象。
l属性验证: 验证捕获的Cookie对象的各个属性(名称、值、有效期、路径、是否安全、是否HttpOnly)是否符合预期。
l保持其他测试不变: 其他测试用例保持不变,以确保整体测试的完整性。
通过这种方式,您可以确保验证的是Cookie的内容,而不是它的引用,这样就可以避免您遇到的问题。请尝试运行更新后的测试代码,看看是否解决了问题!如果还有其他问题,请随时告诉我。
运行,测试用例全部通过
注意:有时需要多次询问ChatGPT才可得到正确答案 |
---|
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
import java.sql.Connection;
import java.sql.SQLException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class DBuserTest {
private DBuser dbUser;
private Connection connection;
@BeforeEach
public void setUp() throws SQLException {
dbUser = new DBuser();
connection = mock(Connection.class);
}
@Test
public void testInsertUser() throws SQLException {
User user = new User("testUser", "testPassword", "1234567890", "test@example.com");
when(connection.prepareStatement(anyString())).thenReturn(mock(java.sql.PreparedStatement.class));
String result = dbUser.insert(connection, user);
assertEquals("1", result);
}
@Test
public void testLoginUserSuccess() throws SQLException {
User user = new User("validUser", "validPassword");
when(connection.prepareStatement(anyString())).thenReturn(mock(java.sql.PreparedStatement.class));
String result = dbUser.login(connection, user);
assertEquals("1", result);
}
@Test
public void testLoginUserFail() throws SQLException {
User user = new User("invalidUser", "invalidPassword");
when(connection.prepareStatement(anyString())).thenReturn(mock(java.sql.PreparedStatement.class));
String result = dbUser.login(connection, user);
assertEquals("0", result);
}
}
testInsertUser()运行失败,改用7.3.2中产生的testInsert_Success()。
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletRequest;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class LoginTest {
private HttpServletResponse response;
private HttpServletRequest request;
private login loginService;
@BeforeEach
public void setUp() {
response = mock(HttpServletResponse.class);
request = mock(HttpServletRequest.class);
loginService = new login(response, request);
}
@Test
public void testSuccessfulLogin() {
when(request.getParameter("username")).thenReturn("validUser");
when(request.getParameter("password")).thenReturn("validPassword");
String result = loginService.myLogin();
assertEquals("0", result);
verify(response).sendRedirect("welcome.jsp");
}
@Test
public void testFailedLogin() {
when(request.getParameter("username")).thenReturn("invalidUser");
when(request.getParameter("password")).thenReturn("invalidPassword");
String result = loginService.myLogin();
assertEquals("用户名或密码错误", result);
}
}
testSuccessfulLogin() 方法后面要加入throws IOException,否则编译不通过。
运行完毕,均报org.opentest4j.AssertionFailedError: expected: <0> but was: <密码应该哈希进行存储>,要对密码进行SHA256散列。
添加util.java
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class util {
public String sha256(String inputString) {
try {
// 创建MessageDigest实例
MessageDigest digest = MessageDigest.getInstance("SHA-256");
// 使用digest()方法散列
byte[] hash = digest.digest(inputString.getBytes("UTF-8"));
// 将字节转换为十六进制字符串
StringBuilder hexString = new StringBuilder();
for (byte b : hash) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) hexString.append('0');
hexString.append(hex);
}
// 打印输出散列值
return(hexString.toString());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return inputString;
}
}
修改LoginTest.java
…
private util Util = new util();
…
@Test
public void testSuccessfulLogin() throws IOException {
when(request.getParameter("username")).thenReturn("validUser");
when(request.getParameter("password")).thenReturn(Util.sha256("validPassword"));
String result = loginService.myLogin();
assertEquals("0", result);
verify(response).sendRedirect("welcome.jsp");
}
@Test
public void testFailedLogin() {
when(request.getParameter("username")).thenReturn("invalidUser");
when(request.getParameter("password")).thenReturn(Util.sha256("invalidPassword"));
String result = loginService.myLogin();
assertEquals("用户名或密码错误", result);
}
运行testSuccessfulLogin()报org.opentest4j.AssertionFailedError: expected: <0> but was: <用户名或密码错误>
看来数据库中没有这条数据。
建立私有方法creatUser()
private void creatUser() throws SQLException {
DBuser dbuser = new DBuser();
Connection conn = dbuser.connect();
User user = new User("validUser",sha.sha256("validPassword"),"13622553344","a@b.com");
dbuser.insert(conn, user);
dbuser.disconnect(conn);
}
将第7.3.2节建立的deleteUser(User user,Connection conn)方法移到util.java中
Public boolean deleteUser(User user,Connection conn) {
try {
String deleteString = "DELETE from user where username=?";
PreparedStatement stmt = conn.prepareStatement(deleteString);
stmt.setString(1, user.getUsername());
int affectedRows = stmt.executeUpdate();
if (affectedRows==1) {
return true;
}else {
return false;
}
} catch (SQLException e) {
e.printStackTrace();
fail("delete failed");
}
eturn false;
}
然后在setUp()和tearDown()中分别加入上面两个方法。
private util Util = new util();
@BeforeEach
public void setUp() throws SQLException {
…
creatUser();
}
@AfterEach
private void tearDown() throws SQLException {
DBuser dbuser = new DBuser();
Connection conn = dbuser.connect();
User user = new User("validUser", Util.sha256("validPassword"),"13622553344","a@b.com");
Util.deleteUser(user,conn);
dbuser.disconnect(conn);
}
运行测试用例,测试通过。
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletRequest;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class RegisterTest {
private HttpServletResponse response;
private HttpServletRequest request;
private register registerService;
@BeforeEach
public void setUp() {
response = mock(HttpServletResponse.class);
request = mock(HttpServletRequest.class);
registerService = new register(response, request);
}
@Test
public void testSuccessfulRegistration() {
when(request.getParameter("username")).thenReturn("newUser");
when(request.getParameter("password")).thenReturn("newPassword");
when(request.getParameter("phone")).thenReturn("1234567890");
when(request.getParameter("email")).thenReturn("newuser@example.com");
String result = registerService.myRegister();
assertEquals("0", result);
verify(response).sendRedirect("login.jsp");
}
@Test
public void testFailedRegistration() {
when(request.getParameter("username")).thenReturn("existingUser");
when(request.getParameter("password")).thenReturn("newPassword");
when(request.getParameter("phone")).thenReturn("1234567890");
when(request.getParameter("email")).thenReturn("existinguser@example.com");
String result = registerService.myRegister();
assertNotEquals("0", result);
}
}
testSuccessfulRegistration()方法后面要加入throws IOException,否则编译不通过。
运行
testSuccessfulRegistration()报org.opentest4j.AssertionFailedError: expected: <0> but was: <手机号必须符合中国手机号码格式>
将两个测试用例的手机号改为13611112222,运行,报org.opentest4j.AssertionFailedError: expected: <0> but was: <密码应该哈希进行存储>。
修改程序,将密码用SHA散列处理。
private util Util = new util();
…
@Test
public void testSuccessfulRegistration() throws IOException {
…
when(request.getParameter("password")).thenReturn(Util.sha256("newPassword"));
…
@Test
public void testFailedRegistration() {
…
when(request.getParameter("password")).thenReturn(Util.sha256("newPassword"));
…
最后,tearDown中删除注册的信息,以免产生过多垃圾数据,影响其他数据。
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
public class UserTest {
@Test
public void testUserCreation() {
User user = new User("testUser", "testPassword", "1234567890", "test@example.com");
assertEquals("testUser", user.getUsername());
assertEquals("testPassword", user.getPassword());
assertEquals("1234567890", user.getPhone());
assertEquals("test@example.com", user.getEmail());
}
}
运行通过
说明
lMockito: 上述测试使用Mockito来模拟HttpServletRequest和HttpServletResponse对象,以便测试逻辑而不依赖于实际的HTTP请求。
lJUnit 5: 所有测试类都使用JUnit 5中的注解和断言进行测试。
l测试用例: 每个测试类针对特定类的功能进行测试,确保各个方法按预期工作。
运行测试
确保您已将JUnit 5和Mockito依赖项添加到您的项目中,然后可以通过IDE或命令行运行这些测试。