问题再现:
这里我写了一测试用户注册接口的测试类,并通过when模拟下层的服务,但实际上when并没有奏效,还是走了真实的service层的逻辑。
java
package cn.ac.evo.review.test;
import cn.ac.evo.review.user.UserMainApplication;
import cn.ac.evo.review.user.register.controller.UserRegisterController;
import cn.ac.evo.review.user.register.model.dto.RegisterDTO;
import cn.ac.evo.review.user.register.service.IUserRegisterService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.web.servlet.MockMvc;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
/**
* @author urfread
* @date 2025-02-20 09:34
*/
@SpringBootTest(classes = UserMainApplication.class)
@AutoConfigureMockMvc
public class UserRegisterTest {
@Autowired
private MockMvc mockMvc;
private RegisterDTO registerDTO;
@Mock
private IUserRegisterService userRegisterService; // 模拟服务层
@BeforeEach
public void setUp() {
registerDTO = new RegisterDTO("3131015733@qq.com", "123456", "123456");
}
// 测试邮箱是否已注册
@Test
public void testCheckEmailRegisteredSuccess() throws Exception {
// 模拟服务层返回的结果
when(userRegisterService.checkEmailRegistered(registerDTO.getEmail())).thenReturn(true);
mockMvc.perform(get("/api/user/register/checkEmailRegistered")
.param("email", registerDTO.getEmail()))
.andExpect(status().isOk())
.andExpect(content().string("true"));
}
@Test
public void testCheckEmailRegisteredFail() throws Exception {
// 模拟服务层返回的结果
when(userRegisterService.checkEmailRegistered(registerDTO.getEmail())).thenReturn(false);
mockMvc.perform(get("/api/user/register/checkEmailRegistered")
.param("email", registerDTO.getEmail()))
.andExpect(status().isOk())
.andExpect(content().string("false"));
}
}
解决
只改一行就可以
java
@Mock
private IUserRegisterService userRegisterService; // 模拟服务层
把这里的 @Mock
改为 @MockBean
,然后 when 就又奏效了。
就是这么简单,有研究了20分钟。