Spring MVC 单元测试 - 未调用模拟服务方法
Spring MVC Unit Testing - Mocked Service method is not called
我正在开发一个 spring 引导项目,其中我有一个调用服务方法并处理输出的控制器。
我正在使用 spring MockMvc 来测试网络层。在我的测试 class 中,我用 Mockito.when() 模拟了服务方法。但是当我调用相应的处理程序方法时,它并没有调用模拟服务方法而是 returns 空响应。
控制器
@Controller
public class SocialLoginEndpoints {
@Autowired
@Qualifier("facebookAuth")
SocialLogin faceBookAuth;
@Autowired
@Qualifier("googleAuth")
SocialLogin googleAuth;
@Autowired SignupService signupService;
@GetMapping("/auth/google")
public String googleAuth(@RequestParam String signupType, HttpServletRequest request) {
return "redirect:" + googleAuth.getAuthURL(request, signupType);
}
}
测试Class
@WebMvcTest(SocialLoginEndpoints.class)
class SocialLoginEndpointsTest {
@Autowired MockMvc mockMvc;
MockHttpServletRequest mockHttpServletRequest;
@MockBean GoogleAuth googleAuth;
@MockBean FacebookAuth facebokAuth;
@MockBean SignupService signupService;
@BeforeEach
void setUp() {
mockHttpServletRequest = new MockHttpServletRequest();
}
@Test
void googleAuth() throws Exception {
Mockito.when(googleAuth.getAuthURL(mockHttpServletRequest, "free"))
.thenReturn("www.google.com");
mockMvc
.perform(MockMvcRequestBuilders.get("/auth/google").param("signupType", "free"))
.andExpect(MockMvcResultMatchers.redirectedUrl("www.google.com"))
.andExpect(MockMvcResultMatchers.status().isFound())
.andDo(MockMvcResultHandlers.print());
Mockito.verify(googleAuth, Mockito.times(1)).getAuthURL(mockHttpServletRequest, "free");
}
返回的响应是
MockHttpServletResponse:
Status = 302
Error message = null
Headers = [Content-Language:"en", Location:"null"]
Content type = null
Body =
Forwarded URL = null
Redirected URL = null
Cookies = []
请帮我解决这个问题。
提前致谢!
您 googleAuth.getAuthURL
打错了。
您在测试中创建并在存根期间使用的 MockHttpServletRequest
与通过 MockMvc
发送的 HttpServletRequest
不同。此外,它们彼此不相等(使用 Object.equals
因为它没有被覆盖)
默认情况下,Mockito 使用 equals 来验证存根中的参数是否与实际调用中的参数匹配。您的存根参数与调用参数不匹配,因此返回该方法的默认值 (null)。
最简单的修复方法是放宽参数匹配器。
Mockito.when(googleAuth.getAuthURL(
any(HttpServletRequest.class),
eq("free")))
.thenReturn("www.google.com");
我正在开发一个 spring 引导项目,其中我有一个调用服务方法并处理输出的控制器。
我正在使用 spring MockMvc 来测试网络层。在我的测试 class 中,我用 Mockito.when() 模拟了服务方法。但是当我调用相应的处理程序方法时,它并没有调用模拟服务方法而是 returns 空响应。
控制器
@Controller
public class SocialLoginEndpoints {
@Autowired
@Qualifier("facebookAuth")
SocialLogin faceBookAuth;
@Autowired
@Qualifier("googleAuth")
SocialLogin googleAuth;
@Autowired SignupService signupService;
@GetMapping("/auth/google")
public String googleAuth(@RequestParam String signupType, HttpServletRequest request) {
return "redirect:" + googleAuth.getAuthURL(request, signupType);
}
}
测试Class
@WebMvcTest(SocialLoginEndpoints.class)
class SocialLoginEndpointsTest {
@Autowired MockMvc mockMvc;
MockHttpServletRequest mockHttpServletRequest;
@MockBean GoogleAuth googleAuth;
@MockBean FacebookAuth facebokAuth;
@MockBean SignupService signupService;
@BeforeEach
void setUp() {
mockHttpServletRequest = new MockHttpServletRequest();
}
@Test
void googleAuth() throws Exception {
Mockito.when(googleAuth.getAuthURL(mockHttpServletRequest, "free"))
.thenReturn("www.google.com");
mockMvc
.perform(MockMvcRequestBuilders.get("/auth/google").param("signupType", "free"))
.andExpect(MockMvcResultMatchers.redirectedUrl("www.google.com"))
.andExpect(MockMvcResultMatchers.status().isFound())
.andDo(MockMvcResultHandlers.print());
Mockito.verify(googleAuth, Mockito.times(1)).getAuthURL(mockHttpServletRequest, "free");
}
返回的响应是
MockHttpServletResponse:
Status = 302
Error message = null
Headers = [Content-Language:"en", Location:"null"]
Content type = null
Body =
Forwarded URL = null
Redirected URL = null
Cookies = []
请帮我解决这个问题。 提前致谢!
您 googleAuth.getAuthURL
打错了。
您在测试中创建并在存根期间使用的 MockHttpServletRequest
与通过 MockMvc
发送的 HttpServletRequest
不同。此外,它们彼此不相等(使用 Object.equals
因为它没有被覆盖)
默认情况下,Mockito 使用 equals 来验证存根中的参数是否与实际调用中的参数匹配。您的存根参数与调用参数不匹配,因此返回该方法的默认值 (null)。
最简单的修复方法是放宽参数匹配器。
Mockito.when(googleAuth.getAuthURL(
any(HttpServletRequest.class),
eq("free")))
.thenReturn("www.google.com");