使用ChatGPT生成关于登录产品代码的单元测试代码

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 使用ChatGPT生成关于登录产品代码的单元测试代码

到目前为止共有以下后端产品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或命令行运行这些测试。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2天前
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
23 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
|
23天前
|
前端开发 JavaScript 测试技术
使用ChatGPT生成登录产品代码的测试用例和测试脚本
使用ChatGPT生成登录产品代码的测试用例和测试脚本
75 35
|
23天前
|
前端开发 JavaScript Java
使用ChatGPT生成登录产品代码
使用ChatGPT生成登录产品代码
67 33
|
1月前
|
机器学习/深度学习 人工智能 搜索推荐
哈佛推出全新类ChatGPT癌症诊断AI,登上Nature!准确率高达96%
哈佛大学研究团队开发的新型AI模型CHIEF,在《自然》期刊发表,癌症诊断准确率达96%。CHIEF基于深度学习,能自动识别、分类癌症并预测生存期,具高准确性、多任务能力和泛化性。它结合病理图像与基因组学等数据,显著提升诊断效率和个性化治疗水平,有望改善医疗资源不平等。但数据隐私和临床效果验证仍是挑战。论文见:https://www.nature.com/articles/s41586-024-07894-z
169 101
|
4天前
|
存储 人工智能 API
ChatGPT-on-WeChat:Star32.4k, DeepSeek加持!这款开源神器秒变AI助手,聊天体验直接起飞!
嗨,大家好,我是小华同学。今天为大家介绍一款结合DeepSeek引擎的开源项目——ChatGPT-on-WeChat,由开发者zhayujie打造。它将微信变成智能AI助手,支持文本、图片、语音对话,具备定时提醒、天气查询等扩展功能,完全开源且易于定制。项目地址:https://github.com/zhayujie/chatgpt-on-wechat。关注我们,获取更多优质开源项目和高效学习方法。
89 11
|
6天前
|
人工智能 自然语言处理 算法
DeepSeek vs ChatGPT:AI对决中的赢家是……人类吗?
DeepSeek VS ChatGPT:DeepSeek以开源黑马姿态崛起,凭借低成本、高性能的「DeepSeek-V3」和专为深度推理设计的「DeepSeek-R1」,成为中小开发者的首选。而ChatGPT则较贵。 然而,AI依赖也带来隐忧,长期使用可能导致记忆衰退和“脑雾”现象。为此,推荐Neuriva解决方案,专注力提升30%,记忆留存率提升2.1倍,助力人类在AI时代保持脑力巅峰。 DeepSeek赢在技术普惠,ChatGPT胜于生态构建,人类的关键在于平衡AI与脑力健康,实现“双核驱动”突破极限!
131 7
|
2月前
|
人工智能 搜索推荐 iOS开发
OpenAI推出适用于iPhone的ChatGPT,与Apple实现具有里程碑意义的AI整合
OpenAI推出适用于iPhone的ChatGPT,与Apple实现具有里程碑意义的AI整合
|
6月前
|
人工智能 自然语言处理 搜索推荐
chatgpt这么火,现在AI搜索引擎有哪些呢?
国外AI搜索引擎包括ChatGPT,擅长自然语言处理与内容生成;Google Bard,提供智能个性化搜索体验;Microsoft Bing集成GPT模型增强智能检索;Perplexity AI以简洁答案及文献引用著称;Neeva强调隐私保护与无广告服务。国内方面,天工AI支持多种功能如知识问答与代码编程;腾讯元宝基于混元模型助力内容创造与学习;360AI搜索以精准全面的信息搜索见长;秘塔AI专注提升写作质量和效率;开搜AI搜索提供个性化智能搜索服务。以上引擎均利用先进AI技术提升用户体验。更多详情参阅[AI搜索合集](zhangfeidezhu.com/?page_id=651)。
182 8
chatgpt这么火,现在AI搜索引擎有哪些呢?
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
HuggingGPT解析:使用 ChatGPT及HuggingFace上的族系解决AI问题
HuggingGPT是一个框架,它使用大型语言模型(如ChatGPT)作为控制器来管理和协调Hugging Face上的AI模型,以语言作为通用接口解决多模态和领域的复杂AI任务。
120 0
HuggingGPT解析:使用 ChatGPT及HuggingFace上的族系解决AI问题
|
6月前
|
机器学习/深度学习 人工智能 算法
为什么ChatGPT等AI大模型都是基于Python开发?
为什么ChatGPT等AI大模型都是基于Python开发?
145 0