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

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: 使用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或命令行运行这些测试。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
5月前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
478 1
|
6月前
|
算法 IDE Java
Java 项目实战之实际代码实现与测试调试全过程详解
本文详细讲解了Java项目的实战开发流程,涵盖项目创建、代码实现(如计算器与汉诺塔问题)、单元测试(使用JUnit)及调试技巧(如断点调试与异常排查),帮助开发者掌握从编码到测试调试的完整技能,提升Java开发实战能力。
601 0
|
4月前
|
安全 Java 测试技术
《深入理解Spring》单元测试——高质量代码的守护神
Spring测试框架提供全面的单元与集成测试支持,通过`@SpringBootTest`、`@WebMvcTest`等注解实现分层测试,结合Mockito、Testcontainers和Jacoco,保障代码质量,提升开发效率与系统稳定性。
|
5月前
|
人工智能 边缘计算 搜索推荐
AI产品测试学习路径全解析:从业务场景到代码实践
本文深入解析AI测试的核心技能与学习路径,涵盖业务理解、模型指标计算与性能测试三大阶段,助力掌握分类、推荐系统、计算机视觉等多场景测试方法,提升AI产品质量保障能力。
|
7月前
|
安全 Java 测试技术
Java 项目实战中现代技术栈下代码实现与测试调试的完整流程
本文介绍基于Java 17和Spring技术栈的现代化项目开发实践。项目采用Gradle构建工具,实现模块化DDD分层架构,结合Spring WebFlux开发响应式API,并应用Record、Sealed Class等新特性。测试策略涵盖JUnit单元测试和Testcontainers集成测试,通过JFR和OpenTelemetry实现性能监控。部署阶段采用Docker容器化和Kubernetes编排,同时展示异步处理和反应式编程的性能优化。整套方案体现了现代Java开发的最佳实践,包括代码实现、测试调试
246 0
|
8月前
|
测试技术 Go 开发者
如何为 gRPC Server 编写本地测试代码
本文介绍了如何使用 Go 语言中的 gRPC 测试工具 **bufconn**,通过内存连接实现 gRPC Server 的本地测试,避免端口冲突和外部依赖。结合示例代码,讲解了初始化内存监听、自定义拨号器及编写测试用例的完整流程,并借助断言库提升测试可读性与准确性。适用于单元及集成测试,助力高效开发。
181 1
|
数据可视化 前端开发 测试技术
接口测试新选择:Postman替代方案全解析
在软件开发中,接口测试工具至关重要。Postman长期占据主导地位,但随着国产工具的崛起,越来越多开发者转向更适合中国市场的替代方案——Apifox。它不仅支持中英文切换、完全免费不限人数,还具备强大的可视化操作、自动生成文档和API调试功能,极大简化了开发流程。
|
8月前
|
Java 测试技术 容器
Jmeter工具使用:HTTP接口性能测试实战
希望这篇文章能够帮助你初步理解如何使用JMeter进行HTTP接口性能测试,有兴趣的话,你可以研究更多关于JMeter的内容。记住,只有理解并掌握了这些工具,你才能充分利用它们发挥其应有的价值。+
1236 23
|
10月前
|
SQL 安全 测试技术
2025接口测试全攻略:高并发、安全防护与六大工具实战指南
本文探讨高并发稳定性验证、安全防护实战及六大工具(Postman、RunnerGo、Apipost、JMeter、SoapUI、Fiddler)选型指南,助力构建未来接口测试体系。接口测试旨在验证数据传输、参数合法性、错误处理能力及性能安全性,其重要性体现在早期发现问题、保障系统稳定和支撑持续集成。常用方法包括功能、性能、安全性及兼容性测试,典型场景涵盖前后端分离开发、第三方服务集成与数据一致性检查。选择合适的工具需综合考虑需求与团队协作等因素。
1622 24

热门文章

最新文章