blob: 9fd65d9ba5d64fa7d40436a2ebe3d9d15efaeaa3 [file] [log] [blame]
22301115cf6dba22025-03-25 19:06:21 +08001package com.example.myproject.controller;
2
223011385e9c35a2025-06-04 15:52:45 +08003import com.example.myproject.entity.Users;
22301115cf6dba22025-03-25 19:06:21 +08004import com.example.myproject.service.UserService;
223011385e9c35a2025-06-04 15:52:45 +08005import com.example.myproject.repository.UserRepository;
22301115cf6dba22025-03-25 19:06:21 +08006import org.junit.jupiter.api.BeforeEach;
7import org.junit.jupiter.api.Test;
223011385e9c35a2025-06-04 15:52:45 +08008import org.mockito.InjectMocks;
9import org.mockito.Mock;
10import org.mockito.MockitoAnnotations;
22301138b2533412025-06-05 00:18:58 +080011import org.springframework.mock.web.MockMultipartFile;
22301115cf6dba22025-03-25 19:06:21 +080012
223011385e9c35a2025-06-04 15:52:45 +080013import java.util.HashMap;
14import java.util.Map;
15import java.util.Optional;
16
2230111590135d72025-06-03 17:11:40 +080017import static org.mockito.Mockito.*;
223011385e9c35a2025-06-04 15:52:45 +080018import static org.junit.jupiter.api.Assertions.*;
22301115cf6dba22025-03-25 19:06:21 +080019
20class UserControllerTest {
21
223011385e9c35a2025-06-04 15:52:45 +080022 @Mock
23 private UserService userService;
24
25 @Mock
26 private UserRepository userRepository;
27
22301115cf6dba22025-03-25 19:06:21 +080028 @InjectMocks
29 private UserController userController;
30
22301115cf6dba22025-03-25 19:06:21 +080031 @BeforeEach
223011385e9c35a2025-06-04 15:52:45 +080032 void setUp() {
33 // 初始化模拟对象
22301115cf6dba22025-03-25 19:06:21 +080034 MockitoAnnotations.openMocks(this);
35 }
36
223011385e9c35a2025-06-04 15:52:45 +080037 // 测试生成邀请码接口
22301115cf6dba22025-03-25 19:06:21 +080038 @Test
223011385e9c35a2025-06-04 15:52:45 +080039 void testGenerateInviteCode() {
40 // 设置输入数据
41 Map<String, Object> request = new HashMap<>();
42 request.put("user_id", 1L);
22301115cf6dba22025-03-25 19:06:21 +080043
223011385e9c35a2025-06-04 15:52:45 +080044 // 模拟服务层的返回
45 Map<String, Object> responseMap = new HashMap<>();
46 responseMap.put("status", "success");
47 responseMap.put("message", "邀请码生成成功");
48 responseMap.put("invite_code", "ABC123XYZ");
22301115cf6dba22025-03-25 19:06:21 +080049
223011385e9c35a2025-06-04 15:52:45 +080050 when(userService.generateInviteCode(1L)).thenReturn(responseMap);
22301115cf6dba22025-03-25 19:06:21 +080051
223011385e9c35a2025-06-04 15:52:45 +080052 // 调用控制器方法
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);
22301115cf6dba22025-03-25 19:06:21 +080062 }
63
223011385e9c35a2025-06-04 15:52:45 +080064 // 测试用户修改密码接口
22301115cf6dba22025-03-25 19:06:21 +080065 @Test
223011385e9c35a2025-06-04 15:52:45 +080066 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");
22301115cf6dba22025-03-25 19:06:21 +080073
223011385e9c35a2025-06-04 15:52:45 +080074 // 模拟服务层的返回
75 String resultMessage = "密码修改成功";
76 when(userService.changePassword(userId, "oldPassword", "newPassword", "newPassword"))
77 .thenReturn(resultMessage);
22301115cf6dba22025-03-25 19:06:21 +080078
223011385e9c35a2025-06-04 15:52:45 +080079 // 调用控制器方法
80 Map<String, Object> resultMap = userController.changePassword(request);
22301115cf6dba22025-03-25 19:06:21 +080081
223011385e9c35a2025-06-04 15:52:45 +080082 // 验证返回结果
83 assertEquals("密码修改成功", resultMap.get("message"));
84 assertEquals("success", resultMap.get("status"));
22301115cf6dba22025-03-25 19:06:21 +080085
223011385e9c35a2025-06-04 15:52:45 +080086 // 验证服务层方法是否被调用
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");
22301115cf6dba22025-03-25 19:06:21 +0800114 }
115
116 @Test
223011385e9c35a2025-06-04 15:52:45 +0800117 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");
22301115cf6dba22025-03-25 19:06:21 +0800129 user.setEmail("test@example.com");
223011385e9c35a2025-06-04 15:52:45 +0800130 when(userRepository.findByUsername("testUser")).thenReturn(Optional.of(user));
22301115cf6dba22025-03-25 19:06:21 +0800131
223011385e9c35a2025-06-04 15:52:45 +0800132 // 设置请求数据
133 Map<String, Object> request = new HashMap<>();
134 request.put("username", username);
135 request.put("password", password);
22301115cf6dba22025-03-25 19:06:21 +0800136
223011385e9c35a2025-06-04 15:52:45 +0800137 // 调用控制器方法
138 Map<String, Object> resultMap = userController.login(request);
22301115cf6dba22025-03-25 19:06:21 +0800139
223011385e9c35a2025-06-04 15:52:45 +0800140 // 验证返回结果
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");
22301115cf6dba22025-03-25 19:06:21 +0800151 }
152
223011385e9c35a2025-06-04 15:52:45 +0800153
154 // 测试获取用户个人资料接口
22301115cf6dba22025-03-25 19:06:21 +0800155 @Test
223011385e9c35a2025-06-04 15:52:45 +0800156 void testGetProfile() {
157 Long userId = 1L;
158
159 // Mock 用户数据
160 Users user = new Users();
161 user.setUserId(userId);
162 user.setUsername("testUser");
22301115cf6dba22025-03-25 19:06:21 +0800163 user.setEmail("test@example.com");
223011385e9c35a2025-06-04 15:52:45 +0800164 user.setAvatarUrl("https://example.com/avatar.jpg");
22301115cf6dba22025-03-25 19:06:21 +0800165
223011385e9c35a2025-06-04 15:52:45 +0800166 // 模拟服务层返回
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);
22301115cf6dba22025-03-25 19:06:21 +0800172
223011385e9c35a2025-06-04 15:52:45 +0800173 // 调用控制器方法
174 Map<String, Object> resultMap = userController.getProfile(userId);
22301115cf6dba22025-03-25 19:06:21 +0800175
223011385e9c35a2025-06-04 15:52:45 +0800176 // 验证返回结果
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<>();
223011385e9c35a2025-06-04 15:52:45 +0800190 profileData.put("nickname", "newNickname");
191 profileData.put("gender", "Male");
192 profileData.put("description", "Updated description");
193 profileData.put("hobbies", "Reading, Hiking");
194
195 // 模拟服务层的返回
22301138b2533412025-06-05 00:18:58 +0800196 when(userService.editProfile(userId, "newNickname", "Male", "Updated description", "Reading, Hiking"))
223011385e9c35a2025-06-04 15:52:45 +0800197 .thenReturn(true);
198
199 // 调用控制器方法
200 Map<String, String> resultMap = userController.editProfile(userId, profileData);
201
202 // 验证返回结果
203 assertEquals("用户资料更新成功", resultMap.get("message"));
204
205 // 验证服务层方法是否被调用
22301138b2533412025-06-05 00:18:58 +0800206 verify(userService, times(1)).editProfile(userId, "newNickname", "Male", "Updated description", "Reading, Hiking");
22301115cf6dba22025-03-25 19:06:21 +0800207 }
208
209 @Test
223011385e9c35a2025-06-04 15:52:45 +0800210 public void testCalculateShareRate() {
211 Long userId = 1L;
22301115cf6dba22025-03-25 19:06:21 +0800212
223011385e9c35a2025-06-04 15:52:45 +0800213 // 模拟 UserService 返回的结果
214 Map<String, Object> expectedResponse = Map.of(
215 "status", "success",
216 "message", "分享率计算成功",
217 "shareRate", 0.5f
218 );
22301115cf6dba22025-03-25 19:06:21 +0800219
223011385e9c35a2025-06-04 15:52:45 +0800220 // 设置用户数据
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);
22301115cf6dba22025-03-25 19:06:21 +0800226
223011385e9c35a2025-06-04 15:52:45 +0800227 // 调用接口
228 Map<String, Object> result = userController.calculateShareRate(userId);
22301115cf6dba22025-03-25 19:06:21 +0800229
223011385e9c35a2025-06-04 15:52:45 +0800230 // 验证结果
231 assertEquals(expectedResponse, result);
232 verify(userService, times(1)).calculateShareRate(userId); // 验证服务方法是否被调用
22301115cf6dba22025-03-25 19:06:21 +0800233 }
22301138b2533412025-06-05 00:18:58 +0800234
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
22301115cf6dba22025-03-25 19:06:21 +0800267}