fix testRegister_success
Change-Id: Ia125fff2481df66233819187a25de74f82ad34c3
diff --git a/src/test/java/com/g9/g9backend/controller/ResourceControllerTest.java b/src/test/java/com/g9/g9backend/controller/ResourceControllerTest.java
new file mode 100644
index 0000000..c02be49
--- /dev/null
+++ b/src/test/java/com/g9/g9backend/controller/ResourceControllerTest.java
@@ -0,0 +1,5 @@
+package com.g9.g9backend.controller;
+
+public class ResourceControllerTest {
+
+}
\ No newline at end of file
diff --git a/src/test/java/com/g9/g9backend/controller/UserControllerTest.java b/src/test/java/com/g9/g9backend/controller/UserControllerTest.java
new file mode 100644
index 0000000..208645c
--- /dev/null
+++ b/src/test/java/com/g9/g9backend/controller/UserControllerTest.java
@@ -0,0 +1,172 @@
+package com.g9.g9backend.controller;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.g9.g9backend.pojo.*;
+import com.g9.g9backend.pojo.DTO.*;
+import com.g9.g9backend.service.*;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.springframework.http.MediaType;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.when;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+
+public class UserControllerTest {
+
+ private MockMvc mockMvc;
+
+ @InjectMocks
+ private UserController userController;
+
+ @Mock
+ private UserService userService;
+
+ @Mock
+ private InvitationService invitationService;
+
+ @Mock
+ private SubscriptionService subscriptionService;
+
+ private final ObjectMapper objectMapper = new ObjectMapper();
+
+ @BeforeEach
+ public void setup() {
+ MockitoAnnotations.openMocks(this);
+ mockMvc = MockMvcBuilders.standaloneSetup(userController).build();
+ }
+
+ // 注册
+ @Test
+ public void testRegister_success() throws Exception {
+ /*
+ 注意单元测试中(使用Mockito ),当多次为同一个方法设置不同的返回值时,后面的设置会覆盖前面的设置
+ 可见单元测试在执行时,本质上在跑实际接口实现,当遇到被mock模拟的方法时,会来测试代码里找对应的when...thenReturn,直接看最后一个设置,所以当测试方法时,测试代码里写的和实际接口的顺序上不是一一对应
+ 而是测试代码里写B C A,实际接口代码里写A B C,当实际代码跑到A时去测试代码里从后往前找到A,而不是看测试代码里第一个是不是A若是再用的逻辑
+ 所以如果写成如下形式:
+ when(userService.getOne(any())).thenReturn(null);
+ ....其他代码
+ when(userService.getOne(any())).thenReturn(new User(2, "hcy", "123", null, 0, 0, null, 0, 0, 0));
+ 则下面的设置会覆盖上面的设置,导致无论什么时候调用该方法,返回的都是非空对象
+ 所以应该写成如下形式:
+ when(userService.getOne(any()))
+ .thenReturn(null) // 第一次调用返回null
+ .thenReturn(new User(2, "hcy", "123", null, 0, 0, null, 0, 0, 0)); // 第二次调用返回非空对象
+ */
+
+ when(userService.getOne(any()))
+ .thenReturn(null) // 第一次调用返回null,表示用户名不是已存在的
+ .thenReturn(new User(2, "hcy", "123", null, 0, 0, null, 0, 0, 0)); // 第二次调用返回非空对象,表示获取添加后的用户信息
+ // 邀请码存在且未被使用
+ when(invitationService.getOne(any())).thenReturn(new Invitation("6RCA7Y8J", 1, 0));
+ // 添加新用户
+ when(userService.save(any())).thenReturn(true);
+ // 设置该邀请码被新添加的新用户使用
+ when(invitationService.update(any())).thenReturn(true);
+ // 获取五个新邀请码
+ when(invitationService.generateInvitationCode()).thenReturn(new String[5]);
+ // 分配给新用户邀请码
+ when(invitationService.save(any())).thenReturn(true);
+ mockMvc.perform(post("/user/register")
+ .contentType(MediaType.APPLICATION_JSON)
+ .content(objectMapper.writeValueAsString(new RegisterDTO("hcy", "123", "6RCA7Y8J"))))
+ .andExpect(status().isOk());
+ }
+
+ @Test
+ public void testRegister_userExists() throws Exception {
+ // 用户名不是已存在的
+ when(userService.getOne(any())).thenReturn(new User(2, "hcy", "123", null, 0, 0, null, 0, 0, 0));
+ mockMvc.perform(post("/user/register")
+ .contentType(MediaType.APPLICATION_JSON)
+ .content(objectMapper.writeValueAsString(new RegisterDTO("hcy", "123", "6RCA7Y8J"))))
+ .andExpect(status().is(407));
+ }
+
+ @Test
+ public void testRegister_invitationNotExist() throws Exception {
+ // 用户名不是已存在的
+ when(userService.getOne(any())).thenReturn(null);
+ // 邀请码不存在
+ when(invitationService.getOne(any())).thenReturn(null);
+ mockMvc.perform(post("/user/register")
+ .contentType(MediaType.APPLICATION_JSON)
+ .content(objectMapper.writeValueAsString(new RegisterDTO("hcy", "123", "6RCA7Y8J"))))
+ .andExpect(status().is(409));
+ }
+
+ @Test
+ public void testRegister_invitationUsed() throws Exception {
+ // 用户名不是已存在的
+ when(userService.getOne(any())).thenReturn(null);
+ // 邀请码存在但已被使用
+ when(invitationService.getOne(any())).thenReturn(new Invitation("6RCA7Y8J", 1, 2));
+ mockMvc.perform(post("/user/register")
+ .contentType(MediaType.APPLICATION_JSON)
+ .content(objectMapper.writeValueAsString(new RegisterDTO("hcy", "123", "6RCA7Y8J"))))
+ .andExpect(status().is(410));
+ }
+
+ // 登录
+ @Test
+ public void testLogin_success() throws Exception {
+ // 设置请求参数
+ User user = new User();
+ user.setUsername("hcy");
+ user.setPassword("123");
+
+ when(userService.getOne(any())).thenReturn(new User(1, "hcy", "123", null, 0, 0, null, 0, 0, 0));
+
+ mockMvc.perform(post("/user/login")
+ .contentType(MediaType.APPLICATION_JSON)
+ .content(objectMapper.writeValueAsString(user)))
+ .andExpect(status().isOk());
+ }
+
+ @Test
+ public void testLogin_userNotFound() throws Exception {
+ //设置请求参数
+ User user = new User();
+ user.setUsername("hcy");
+ user.setPassword("123");
+
+ when(userService.getOne(any())).thenReturn(null);
+
+ mockMvc.perform(post("/user/login")
+ .contentType(MediaType.APPLICATION_JSON)
+ .content(objectMapper.writeValueAsString(user)))
+ .andExpect(status().is(406));
+ }
+
+ @Test
+ public void testLogin_wrongPassword() throws Exception {
+ // 设置请求参数
+ User user = new User();
+ user.setUsername("hcy");
+ user.setPassword("wrongPassword");
+
+ when(userService.getOne(any())).thenReturn(new User(1, "hcy", "123", null, 0, 0, null, 0, 0, 0));
+
+ mockMvc.perform(post("/user/login")
+ .contentType(MediaType.APPLICATION_JSON)
+ .content(objectMapper.writeValueAsString(user)))
+ .andExpect(status().is(408));
+ }
+
+ // 关注
+ @Test
+ public void testSubscription() throws Exception {
+ when(subscriptionService.save(any())).thenReturn(true);
+
+ mockMvc.perform(post("/user/subscription")
+ .contentType(MediaType.APPLICATION_JSON)
+ .content(objectMapper.writeValueAsString(new Subscription(1, 2))))
+ .andExpect(status().isOk());
+ }
+}
\ No newline at end of file