当前位置: 首页 > 知识库问答 >
问题:

未调用Spring MVC单元测试模拟服务方法

邰钟展
2023-03-14

我正在进行一个spring-boot项目,其中我有一个控制器,它调用服务方法并处理输出。

我正在使用spring MockMvc测试web层。在我的测试类中,我用Mockito.when()模拟了服务方法。但是当我调用相应的处理方法时,它不是调用被模仿的服务方法,而是返回一个空响应。

控制

@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);
  }
}

测试类

@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 = []

请帮我解决这个问题。提前谢谢!

共有1个答案

栾峰
2023-03-14

您错误地存根了谷歌自动网址

您在测试中创建并在存根期间使用的MockHttpServletRequest与通过MockMvcHttpServletRequest发送的 Http ServletRequestObject.equals未被重写,因此使用)

默认情况下,Mockito使用equals来验证存根中的参数是否与实际调用中的参数匹配。您的存根参数与调用参数不匹配,因此将返回方法的默认值(null)。

最简单的解决方法是放松参数匹配器。

Mockito.when(googleAuth.getAuthURL(
                 any(HttpServletRequest.class), 
                 eq("free")))
       .thenReturn("www.google.com");
 类似资料:
  • 我不熟悉单元测试。参考google之后,我创建了一个测试类来测试我的控制器,如下所示: 我有以下控制器和服务类: 当我调试单元测试时,控制器中的p对象为null。我的状态是200,但不是预期的JSON响应 我错过了什么?

  • 我想对一个组件的功能进行单元测试。因此,我需要一个模拟服务(根据角度测试指南)。 这里是我的测试床: 那么,嘲笑服务价值的正确方法是什么呢? 弗兰克

  • 我已经开始考虑在我的项目中围绕一些业务逻辑添加一些单元测试。 我想测试的第一个方法是服务层中的一个方法,它返回给定节点的子节点列表。 该方法如下所示: 我想象这样的测试方法是提供一个假树结构,然后测试提供节点是否返回正确的子节点。 ssdsContext是一个对象上下文。 我已经看到可以为提取和接口如何模拟ObjectContext或ObjectQuery 我还读到,as Entity Frame

  • 问题内容: 在Angular中,所有内容似乎都具有陡峭的学习曲线,并且对Angular应用程序进行单元测试绝对不能逃脱这种范例。 当我开始使用TDD和Angular时,我觉得我花了两倍(可能更多)的时间来弄清楚如何测试,甚至花更多的时间来正确地设置测试。但是正如Ben Nadel 在他的博客中所说的那样,角度学习过程存在起伏。他的图表绝对是我在Angular的经历。 但是,随着我在学习Angula

  • 我正在尝试对服务方法进行单元测试。服务方法调用spring数据存储库方法来获取一些数据。我想模拟这个存储库调用,并自己提供数据。如何做到这一点?在Spring Boot文档之后,当我模拟存储库并在测试代码中直接调用存储库方法时,模拟工作正常。但是,当我调用服务方法时,反过来调用存储库方法,mocking就不起作用了。下面是示例代码: 服务级别: 测试等级:

  • 我试图模拟一个方法链(嵌套)以返回所需的值,这是代码: 我试过这个模拟,但它不起作用: 任何解决方案如何解决这样的问题? 非常感谢。