blob: a97e16971fb6117265c0b6d837d956c490f2a7bf [file] [log] [blame]
22301115cf6dba22025-03-25 19:06:21 +08001package com.example.myproject.controller;
2
22301138f6824512025-06-04 02:03:13 +08003import com.example.myproject.entity.Users;
22301115cf6dba22025-03-25 19:06:21 +08004import com.example.myproject.service.UserService;
22301138f6824512025-06-04 02:03:13 +08005import com.example.myproject.repository.UserRepository;
22301115cf6dba22025-03-25 19:06:21 +08006import org.junit.jupiter.api.BeforeEach;
7import org.junit.jupiter.api.Test;
22301138f6824512025-06-04 02:03:13 +08008import org.mockito.InjectMocks;
9import org.mockito.Mock;
10import org.mockito.MockitoAnnotations;
22301115cf6dba22025-03-25 19:06:21 +080011
22301138f6824512025-06-04 02:03:13 +080012import java.util.HashMap;
13import java.util.Map;
14import java.util.Optional;
15
22301115cf6dba22025-03-25 19:06:21 +080016import static org.mockito.Mockito.*;
22301138f6824512025-06-04 02:03:13 +080017import static org.junit.jupiter.api.Assertions.*;
22301115cf6dba22025-03-25 19:06:21 +080018
19class UserControllerTest {
20
22301138f6824512025-06-04 02:03:13 +080021 @Mock
22 private UserService userService;
23
24 @Mock
25 private UserRepository userRepository;
26
22301115cf6dba22025-03-25 19:06:21 +080027 @InjectMocks
28 private UserController userController;
29
22301115cf6dba22025-03-25 19:06:21 +080030 @BeforeEach
22301138f6824512025-06-04 02:03:13 +080031 void setUp() {
32 // 初始化模拟对象
22301115cf6dba22025-03-25 19:06:21 +080033 MockitoAnnotations.openMocks(this);
34 }
35
22301138f6824512025-06-04 02:03:13 +080036 // 测试生成邀请码接口
22301115cf6dba22025-03-25 19:06:21 +080037 @Test
22301138f6824512025-06-04 02:03:13 +080038 void testGenerateInviteCode() {
39 // 设置输入数据
40 Map<String, Object> request = new HashMap<>();
41 request.put("user_id", 1L);
22301115cf6dba22025-03-25 19:06:21 +080042
22301138f6824512025-06-04 02:03:13 +080043 // 模拟服务层的返回
44 Map<String, Object> responseMap = new HashMap<>();
45 responseMap.put("status", "success");
46 responseMap.put("message", "邀请码生成成功");
47 responseMap.put("invite_code", "ABC123XYZ");
22301115cf6dba22025-03-25 19:06:21 +080048
22301138f6824512025-06-04 02:03:13 +080049 when(userService.generateInviteCode(1L)).thenReturn(responseMap);
22301115cf6dba22025-03-25 19:06:21 +080050
22301138f6824512025-06-04 02:03:13 +080051 // 调用控制器方法
52 Map<String, Object> resultMap = userController.generateInviteCode(request);
53
54 // 验证返回结果
55 assertEquals("success", resultMap.get("status"));
56 assertEquals("邀请码生成成功", resultMap.get("message"));
57 assertEquals("ABC123XYZ", resultMap.get("invite_code"));
58
59 // 验证服务层方法是否被调用
60 verify(userService, times(1)).generateInviteCode(1L);
22301115cf6dba22025-03-25 19:06:21 +080061 }
62
22301138f6824512025-06-04 02:03:13 +080063 // 测试用户修改密码接口
22301115cf6dba22025-03-25 19:06:21 +080064 @Test
22301138f6824512025-06-04 02:03:13 +080065 void testChangePassword() {
66 Long userId = 1L;
67 Map<String, Object> request = new HashMap<>();
68 request.put("user_id", userId);
69 request.put("old_password", "oldPassword");
70 request.put("new_password", "newPassword");
71 request.put("confirm_password", "newPassword");
22301115cf6dba22025-03-25 19:06:21 +080072
22301138f6824512025-06-04 02:03:13 +080073 // 模拟服务层的返回
74 String resultMessage = "密码修改成功";
75 when(userService.changePassword(userId, "oldPassword", "newPassword", "newPassword"))
76 .thenReturn(resultMessage);
22301115cf6dba22025-03-25 19:06:21 +080077
22301138f6824512025-06-04 02:03:13 +080078 // 调用控制器方法
79 Map<String, Object> resultMap = userController.changePassword(request);
22301115cf6dba22025-03-25 19:06:21 +080080
22301138f6824512025-06-04 02:03:13 +080081 // 验证返回结果
82 assertEquals("密码修改成功", resultMap.get("message"));
83 assertEquals("success", resultMap.get("status"));
22301115cf6dba22025-03-25 19:06:21 +080084
22301138f6824512025-06-04 02:03:13 +080085 // 验证服务层方法是否被调用
86 verify(userService, times(1)).changePassword(userId, "oldPassword", "newPassword", "newPassword");
87 }
88
89 // 测试用户注册接口
90 @Test
91 void testRegister() {
92 // 设置输入数据
93 Map<String, Object> request = new HashMap<>();
94 request.put("username", "testUser");
95 request.put("email", "test@example.com");
96 request.put("password", "password");
97 request.put("role", "USER");
98 request.put("inviteCode", "12345");
99
100 // 模拟服务层的返回
101 String resultMessage = "用户注册成功";
102 when(userService.registerUser("testUser", "test@example.com", "password", "USER", "12345"))
103 .thenReturn(resultMessage);
104
105 // 调用控制器方法
106 Map<String, Object> resultMap = userController.register(request);
107
108 // 验证返回结果
109 assertEquals("用户注册成功", resultMap.get("msg"));
110
111 // 验证服务层方法是否被调用
112 verify(userService, times(1)).registerUser("testUser", "test@example.com", "password", "USER", "12345");
22301115cf6dba22025-03-25 19:06:21 +0800113 }
114
115 @Test
22301138f6824512025-06-04 02:03:13 +0800116 void testLogin() {
117 String username = "testUser";
118 String password = "password";
119
120 // 模拟服务层的返回
121 String loginMessage = "登录成功";
122 when(userService.loginUser("testUser", "password")).thenReturn(loginMessage);
123
124 // 模拟用户查询
125 Users user = new Users();
126 user.setUserId(1L);
127 user.setUsername("testUser");
22301115cf6dba22025-03-25 19:06:21 +0800128 user.setEmail("test@example.com");
22301138f6824512025-06-04 02:03:13 +0800129 when(userRepository.findByUsername("testUser")).thenReturn(Optional.of(user));
22301115cf6dba22025-03-25 19:06:21 +0800130
22301138f6824512025-06-04 02:03:13 +0800131 // 设置请求数据
132 Map<String, Object> request = new HashMap<>();
133 request.put("username", username);
134 request.put("password", password);
22301115cf6dba22025-03-25 19:06:21 +0800135
22301138f6824512025-06-04 02:03:13 +0800136 // 调用控制器方法
137 Map<String, Object> resultMap = userController.login(request);
22301115cf6dba22025-03-25 19:06:21 +0800138
22301138f6824512025-06-04 02:03:13 +0800139 // 验证返回结果
140 assertEquals("登录成功", resultMap.get("msg"));
141
142 // 验证 user 不是 Map 类型,而是 Users 对象
143 Users loggedInUser = (Users) resultMap.get("user");
144 assertNotNull(loggedInUser);
145 assertEquals("testUser", loggedInUser.getUsername());
146 assertEquals("test@example.com", loggedInUser.getEmail());
147
148 // 验证服务层方法是否被调用
149 verify(userService, times(1)).loginUser("testUser", "password");
22301115cf6dba22025-03-25 19:06:21 +0800150 }
151
22301138f6824512025-06-04 02:03:13 +0800152
153 // 测试获取用户个人资料接口
22301115cf6dba22025-03-25 19:06:21 +0800154 @Test
22301138f6824512025-06-04 02:03:13 +0800155 void testGetProfile() {
156 Long userId = 1L;
157
158 // Mock 用户数据
159 Users user = new Users();
160 user.setUserId(userId);
161 user.setUsername("testUser");
22301115cf6dba22025-03-25 19:06:21 +0800162 user.setEmail("test@example.com");
22301138f6824512025-06-04 02:03:13 +0800163 user.setAvatarUrl("https://example.com/avatar.jpg");
22301115cf6dba22025-03-25 19:06:21 +0800164
22301138f6824512025-06-04 02:03:13 +0800165 // 模拟服务层返回
166 Map<String, Object> profileData = new HashMap<>();
167 profileData.put("avatarUrl", user.getAvatarUrl());
168 profileData.put("username", user.getUsername());
169 profileData.put("email", user.getEmail());
170 when(userService.getProfile(userId)).thenReturn(profileData);
22301115cf6dba22025-03-25 19:06:21 +0800171
22301138f6824512025-06-04 02:03:13 +0800172 // 调用控制器方法
173 Map<String, Object> resultMap = userController.getProfile(userId);
22301115cf6dba22025-03-25 19:06:21 +0800174
22301138f6824512025-06-04 02:03:13 +0800175 // 验证返回结果
176 assertEquals("testUser", resultMap.get("username"));
177 assertEquals("test@example.com", resultMap.get("email"));
178 assertEquals("https://example.com/avatar.jpg", resultMap.get("avatarUrl"));
179
180 // 验证服务层方法是否被调用
181 verify(userService, times(1)).getProfile(userId);
182 }
183
184 // 测试修改用户个人资料接口
185 @Test
186 void testEditProfile() {
187 Long userId = 1L;
188 Map<String, Object> profileData = new HashMap<>();
189 profileData.put("avatarUrl", "https://example.com/avatar.jpg");
190 profileData.put("nickname", "newNickname");
191 profileData.put("gender", "Male");
192 profileData.put("description", "Updated description");
193 profileData.put("hobbies", "Reading, Hiking");
194
195 // 模拟服务层的返回
196 when(userService.editProfile(userId, "https://example.com/avatar.jpg", "newNickname", "Male", "Updated description", "Reading, Hiking"))
197 .thenReturn(true);
198
199 // 调用控制器方法
200 Map<String, String> resultMap = userController.editProfile(userId, profileData);
201
202 // 验证返回结果
203 assertEquals("用户资料更新成功", resultMap.get("message"));
204
205 // 验证服务层方法是否被调用
206 verify(userService, times(1)).editProfile(userId, "https://example.com/avatar.jpg", "newNickname", "Male", "Updated description", "Reading, Hiking");
22301115cf6dba22025-03-25 19:06:21 +0800207 }
208
209 @Test
22301138f6824512025-06-04 02:03:13 +0800210 public void testCalculateShareRate() {
211 Long userId = 1L;
22301115cf6dba22025-03-25 19:06:21 +0800212
22301138f6824512025-06-04 02:03:13 +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
22301138f6824512025-06-04 02:03:13 +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
22301138f6824512025-06-04 02:03:13 +0800227 // 调用接口
228 Map<String, Object> result = userController.calculateShareRate(userId);
22301115cf6dba22025-03-25 19:06:21 +0800229
22301138f6824512025-06-04 02:03:13 +0800230 // 验证结果
231 assertEquals(expectedResponse, result);
232 verify(userService, times(1)).calculateShareRate(userId); // 验证服务方法是否被调用
22301115cf6dba22025-03-25 19:06:21 +0800233 }
234}