前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >使用ChatGPT生成关于登录产品代码的单元测试代码

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

作者头像
顾翔
发布2024-12-19 19:44:49
发布2024-12-19 19:44:49
8200
代码可运行
举报
运行总次数:0
代码可运行

到目前为止共有以下后端产品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
代码运行次数:0
复制
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
代码运行次数:0
复制
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
代码运行次数:0
复制
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
代码运行次数: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

代码语言:javascript
代码运行次数:0
复制
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
代码运行次数:0
复制
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
代码运行次数:0
复制
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

代码语言:javascript
代码运行次数:0
复制
@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
代码运行次数:0
复制
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
代码运行次数:0
复制
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才可得到正确答案

11.2.2 DBuserTest.java

代码语言:javascript
代码运行次数:0
复制
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
代码运行次数:0
复制
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
代码运行次数:0
复制
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
代码运行次数:0
复制
…
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
代码运行次数:0
复制
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
代码运行次数:0
复制
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
代码运行次数:0
复制
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
代码运行次数:0
复制
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
代码运行次数:0
复制
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
代码运行次数:0
复制
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或命令行运行这些测试。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-12-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 到目前为止共有以下后端产品java代码更改过:
    • 11.1 申请登录产品Java文件的单元测试用例
      • 11.1.1 CookiesManager.java
      • 11.1.2 DBuser.java
      • 1.1.4 register.java
      • 11.2.1 CookiesManagerTest.java
      • 11.2.2 DBuserTest.java
      • 11.2.3 LoginTest.java
      • 11.2.4 RegisterTest.java
      • 11.2.5 UserTest.java
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档