到目前为止共有以下后端产品java代码更改过:
CookiesManager.java、DBuser.java、login.java、register.java和User.java。validateUser.java和Util.javam没有发生变化。
11.1 申请登录产品Java文件的单元测试用例
请对下面Java代码产生JUnit5的测试用例
11.1.1 CookiesManager.java
代码语言:javascript
复制
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; } }
11.1.2 DBuser.java
代码语言:javascript
复制
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
代码语言:javascript
复制
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"; } }
1.1.4 register.java
代码语言:javascript
复制
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
代码语言:javascript
复制
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依赖项到您的项目中。
11.2.1 CookiesManagerTest.java
代码语言:javascript
复制
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
代码语言:javascript
复制
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); } }
说明
setCookie测试: 验证是否调用了response.addCookie()方法,并传入了正确的Cookie对象。
getCookie测试: 如果请求中包含指定名称的Cookie,验证返回的值是否正确。
setCookieWithNullValue测试: 验证当Cookie值为null时,addCookie方法不会被调用。
getCookieWhenNotFound测试: 测试当请求中没有Cookie时,返回的值应为null。
请更新您的测试代码并运行以确保一切正常。如果您有其他问题或需要进一步的帮助,请随时告诉我!
运行testSetCookie()仍旧报错,再次询问ChatGPT
代码语言:javascript
复制
@Test public void testSetCookie() { cookiesManager = new CookiesManager("testCookie", "testValue", response, request); cookiesManager.setCookie(); // 验证是否添加了Cookie Cookie myCookie = new Cookie("testCookie", "testValue"); verify(response).addCookie(myCookie); }
报
代码语言:javascript
复制
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 方法
代码语言:javascript
复制
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); } }
说明
ArgumentCaptor: 使用ArgumentCaptor来捕获传递给addCookie方法的Cookie对象。
属性验证: 验证捕获的Cookie对象的各个属性(名称、值、有效期、路径、是否安全、是否HttpOnly)是否符合预期。
保持其他测试不变: 其他测试用例保持不变,以确保整体测试的完整性。
通过这种方式,您可以确保验证的是Cookie的内容,而不是它的引用,这样就可以避免您遇到的问题。请尝试运行更新后的测试代码,看看是否解决了问题!如果还有其他问题,请随时告诉我。
运行,测试用例全部通过
注意:有时需要多次询问ChatGPT才可得到正确答案 |
11.2.2 DBuserTest.java
代码语言:javascript
复制
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()。
11.2.3 LoginTest.java
代码语言:javascript
复制
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
代码语言:javascript
复制
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
代码语言:javascript
复制
… 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()
代码语言:javascript
复制
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中
代码语言:javascript
复制
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()中分别加入上面两个方法。
代码语言:javascript
复制
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); }
运行测试用例,测试通过。
11.2.4 RegisterTest.java
代码语言:javascript
复制
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散列处理。
代码语言:javascript
复制
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中删除注册的信息,以免产生过多垃圾数据,影响其他数据。
11.2.5 UserTest.java
代码语言:javascript
复制
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或命令行运行这些测试。