22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 1 | package com.example.myproject.controller; |
| 2 | |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 3 | import com.example.myproject.entity.Users; |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 4 | import com.example.myproject.service.UserService; |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 5 | import com.example.myproject.repository.UserRepository; |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 6 | import org.junit.jupiter.api.BeforeEach; |
| 7 | import org.junit.jupiter.api.Test; |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 8 | import org.mockito.InjectMocks; |
| 9 | import org.mockito.Mock; |
| 10 | import org.mockito.MockitoAnnotations; |
22301138 | b253341 | 2025-06-05 00:18:58 +0800 | [diff] [blame^] | 11 | import org.springframework.mock.web.MockMultipartFile; |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 12 | |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 13 | import java.util.HashMap; |
| 14 | import java.util.Map; |
| 15 | import java.util.Optional; |
| 16 | |
22301115 | 90135d7 | 2025-06-03 17:11:40 +0800 | [diff] [blame] | 17 | import static org.mockito.Mockito.*; |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 18 | import static org.junit.jupiter.api.Assertions.*; |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 19 | |
| 20 | class UserControllerTest { |
| 21 | |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 22 | @Mock |
| 23 | private UserService userService; |
| 24 | |
| 25 | @Mock |
| 26 | private UserRepository userRepository; |
| 27 | |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 28 | @InjectMocks |
| 29 | private UserController userController; |
| 30 | |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 31 | @BeforeEach |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 32 | void setUp() { |
| 33 | // 初始化模拟对象 |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 34 | MockitoAnnotations.openMocks(this); |
| 35 | } |
| 36 | |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 37 | // 测试生成邀请码接口 |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 38 | @Test |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 39 | void testGenerateInviteCode() { |
| 40 | // 设置输入数据 |
| 41 | Map<String, Object> request = new HashMap<>(); |
| 42 | request.put("user_id", 1L); |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 43 | |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 44 | // 模拟服务层的返回 |
| 45 | Map<String, Object> responseMap = new HashMap<>(); |
| 46 | responseMap.put("status", "success"); |
| 47 | responseMap.put("message", "邀请码生成成功"); |
| 48 | responseMap.put("invite_code", "ABC123XYZ"); |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 49 | |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 50 | when(userService.generateInviteCode(1L)).thenReturn(responseMap); |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 51 | |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 52 | // 调用控制器方法 |
| 53 | Map<String, Object> resultMap = userController.generateInviteCode(request); |
| 54 | |
| 55 | // 验证返回结果 |
| 56 | assertEquals("success", resultMap.get("status")); |
| 57 | assertEquals("邀请码生成成功", resultMap.get("message")); |
| 58 | assertEquals("ABC123XYZ", resultMap.get("invite_code")); |
| 59 | |
| 60 | // 验证服务层方法是否被调用 |
| 61 | verify(userService, times(1)).generateInviteCode(1L); |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 62 | } |
| 63 | |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 64 | // 测试用户修改密码接口 |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 65 | @Test |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 66 | void testChangePassword() { |
| 67 | Long userId = 1L; |
| 68 | Map<String, Object> request = new HashMap<>(); |
| 69 | request.put("user_id", userId); |
| 70 | request.put("old_password", "oldPassword"); |
| 71 | request.put("new_password", "newPassword"); |
| 72 | request.put("confirm_password", "newPassword"); |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 73 | |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 74 | // 模拟服务层的返回 |
| 75 | String resultMessage = "密码修改成功"; |
| 76 | when(userService.changePassword(userId, "oldPassword", "newPassword", "newPassword")) |
| 77 | .thenReturn(resultMessage); |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 78 | |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 79 | // 调用控制器方法 |
| 80 | Map<String, Object> resultMap = userController.changePassword(request); |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 81 | |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 82 | // 验证返回结果 |
| 83 | assertEquals("密码修改成功", resultMap.get("message")); |
| 84 | assertEquals("success", resultMap.get("status")); |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 85 | |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 86 | // 验证服务层方法是否被调用 |
| 87 | verify(userService, times(1)).changePassword(userId, "oldPassword", "newPassword", "newPassword"); |
| 88 | } |
| 89 | |
| 90 | // 测试用户注册接口 |
| 91 | @Test |
| 92 | void testRegister() { |
| 93 | // 设置输入数据 |
| 94 | Map<String, Object> request = new HashMap<>(); |
| 95 | request.put("username", "testUser"); |
| 96 | request.put("email", "test@example.com"); |
| 97 | request.put("password", "password"); |
| 98 | request.put("role", "USER"); |
| 99 | request.put("inviteCode", "12345"); |
| 100 | |
| 101 | // 模拟服务层的返回 |
| 102 | String resultMessage = "用户注册成功"; |
| 103 | when(userService.registerUser("testUser", "test@example.com", "password", "USER", "12345")) |
| 104 | .thenReturn(resultMessage); |
| 105 | |
| 106 | // 调用控制器方法 |
| 107 | Map<String, Object> resultMap = userController.register(request); |
| 108 | |
| 109 | // 验证返回结果 |
| 110 | assertEquals("用户注册成功", resultMap.get("msg")); |
| 111 | |
| 112 | // 验证服务层方法是否被调用 |
| 113 | verify(userService, times(1)).registerUser("testUser", "test@example.com", "password", "USER", "12345"); |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 114 | } |
| 115 | |
| 116 | @Test |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 117 | void testLogin() { |
| 118 | String username = "testUser"; |
| 119 | String password = "password"; |
| 120 | |
| 121 | // 模拟服务层的返回 |
| 122 | String loginMessage = "登录成功"; |
| 123 | when(userService.loginUser("testUser", "password")).thenReturn(loginMessage); |
| 124 | |
| 125 | // 模拟用户查询 |
| 126 | Users user = new Users(); |
| 127 | user.setUserId(1L); |
| 128 | user.setUsername("testUser"); |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 129 | user.setEmail("test@example.com"); |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 130 | when(userRepository.findByUsername("testUser")).thenReturn(Optional.of(user)); |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 131 | |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 132 | // 设置请求数据 |
| 133 | Map<String, Object> request = new HashMap<>(); |
| 134 | request.put("username", username); |
| 135 | request.put("password", password); |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 136 | |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 137 | // 调用控制器方法 |
| 138 | Map<String, Object> resultMap = userController.login(request); |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 139 | |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 140 | // 验证返回结果 |
| 141 | assertEquals("登录成功", resultMap.get("msg")); |
| 142 | |
| 143 | // 验证 user 不是 Map 类型,而是 Users 对象 |
| 144 | Users loggedInUser = (Users) resultMap.get("user"); |
| 145 | assertNotNull(loggedInUser); |
| 146 | assertEquals("testUser", loggedInUser.getUsername()); |
| 147 | assertEquals("test@example.com", loggedInUser.getEmail()); |
| 148 | |
| 149 | // 验证服务层方法是否被调用 |
| 150 | verify(userService, times(1)).loginUser("testUser", "password"); |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 151 | } |
| 152 | |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 153 | |
| 154 | // 测试获取用户个人资料接口 |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 155 | @Test |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 156 | void testGetProfile() { |
| 157 | Long userId = 1L; |
| 158 | |
| 159 | // Mock 用户数据 |
| 160 | Users user = new Users(); |
| 161 | user.setUserId(userId); |
| 162 | user.setUsername("testUser"); |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 163 | user.setEmail("test@example.com"); |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 164 | user.setAvatarUrl("https://example.com/avatar.jpg"); |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 165 | |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 166 | // 模拟服务层返回 |
| 167 | Map<String, Object> profileData = new HashMap<>(); |
| 168 | profileData.put("avatarUrl", user.getAvatarUrl()); |
| 169 | profileData.put("username", user.getUsername()); |
| 170 | profileData.put("email", user.getEmail()); |
| 171 | when(userService.getProfile(userId)).thenReturn(profileData); |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 172 | |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 173 | // 调用控制器方法 |
| 174 | Map<String, Object> resultMap = userController.getProfile(userId); |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 175 | |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 176 | // 验证返回结果 |
| 177 | assertEquals("testUser", resultMap.get("username")); |
| 178 | assertEquals("test@example.com", resultMap.get("email")); |
| 179 | assertEquals("https://example.com/avatar.jpg", resultMap.get("avatarUrl")); |
| 180 | |
| 181 | // 验证服务层方法是否被调用 |
| 182 | verify(userService, times(1)).getProfile(userId); |
| 183 | } |
| 184 | |
| 185 | // 测试修改用户个人资料接口 |
| 186 | @Test |
| 187 | void testEditProfile() { |
| 188 | Long userId = 1L; |
| 189 | Map<String, Object> profileData = new HashMap<>(); |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 190 | profileData.put("nickname", "newNickname"); |
| 191 | profileData.put("gender", "Male"); |
| 192 | profileData.put("description", "Updated description"); |
| 193 | profileData.put("hobbies", "Reading, Hiking"); |
| 194 | |
| 195 | // 模拟服务层的返回 |
22301138 | b253341 | 2025-06-05 00:18:58 +0800 | [diff] [blame^] | 196 | when(userService.editProfile(userId, "newNickname", "Male", "Updated description", "Reading, Hiking")) |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 197 | .thenReturn(true); |
| 198 | |
| 199 | // 调用控制器方法 |
| 200 | Map<String, String> resultMap = userController.editProfile(userId, profileData); |
| 201 | |
| 202 | // 验证返回结果 |
| 203 | assertEquals("用户资料更新成功", resultMap.get("message")); |
| 204 | |
| 205 | // 验证服务层方法是否被调用 |
22301138 | b253341 | 2025-06-05 00:18:58 +0800 | [diff] [blame^] | 206 | verify(userService, times(1)).editProfile(userId, "newNickname", "Male", "Updated description", "Reading, Hiking"); |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 207 | } |
| 208 | |
| 209 | @Test |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 210 | public void testCalculateShareRate() { |
| 211 | Long userId = 1L; |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 212 | |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 213 | // 模拟 UserService 返回的结果 |
| 214 | Map<String, Object> expectedResponse = Map.of( |
| 215 | "status", "success", |
| 216 | "message", "分享率计算成功", |
| 217 | "shareRate", 0.5f |
| 218 | ); |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 219 | |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 220 | // 设置用户数据 |
| 221 | Users user = new Users(); |
| 222 | user.setUserId(userId); |
| 223 | user.setUploadCount(50f); // 上传量为50 |
| 224 | user.setDownloadCount(100f); // 下载量为100 |
| 225 | when(userService.calculateShareRate(userId)).thenReturn(expectedResponse); |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 226 | |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 227 | // 调用接口 |
| 228 | Map<String, Object> result = userController.calculateShareRate(userId); |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 229 | |
22301138 | 5e9c35a | 2025-06-04 15:52:45 +0800 | [diff] [blame] | 230 | // 验证结果 |
| 231 | assertEquals(expectedResponse, result); |
| 232 | verify(userService, times(1)).calculateShareRate(userId); // 验证服务方法是否被调用 |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 233 | } |
22301138 | b253341 | 2025-06-05 00:18:58 +0800 | [diff] [blame^] | 234 | |
| 235 | @Test |
| 236 | void testUploadUserAvatar() throws Exception { |
| 237 | Long userId = 1L; |
| 238 | |
| 239 | // 构造 Mock 文件 |
| 240 | MockMultipartFile mockFile = new MockMultipartFile( |
| 241 | "file", |
| 242 | "avatar.jpg", |
| 243 | "image/jpeg", |
| 244 | "fake image content".getBytes() |
| 245 | ); |
| 246 | |
| 247 | // 构造返回值 |
| 248 | Map<String, Object> mockResponse = new HashMap<>(); |
| 249 | mockResponse.put("status", "success"); |
| 250 | mockResponse.put("message", "头像上传成功"); |
| 251 | mockResponse.put("userId", userId); |
| 252 | mockResponse.put("avatarUrl", "/uploads/avatarUrl/1.jpg"); |
| 253 | |
| 254 | when(userService.uploadUserAvatar(userId, mockFile)).thenReturn(mockResponse); |
| 255 | |
| 256 | Map<String, Object> resultMap = userController.uploadAvatar(userId, mockFile); |
| 257 | assertEquals("success", resultMap.get("status")); |
| 258 | assertEquals("头像上传成功", resultMap.get("message")); |
| 259 | assertEquals(userId, resultMap.get("userId")); |
| 260 | assertEquals("/uploads/avatarUrl/1.jpg", resultMap.get("avatarUrl")); |
| 261 | |
| 262 | // 验证 service 被调用一次 |
| 263 | verify(userService, times(1)).uploadUserAvatar(userId, mockFile); |
| 264 | } |
| 265 | |
| 266 | |
22301115 | cf6dba2 | 2025-03-25 19:06:21 +0800 | [diff] [blame] | 267 | } |