【问题标题】:REST endpoint with @QuerydslPredicate Predicate mocking test带有 @QuerydslPredicate 谓词模拟测试的 REST 端点
【发布时间】:2017-11-14 06:50:04
【问题描述】:

我有一个休息控制器,它的参数 com.querydsl.core.types.Predicate 用 @QuerydslPredicate 注释

ResponseEntity<List<Employee>> listEmployees(@QuerydslPredicate(root = Employee.class) Predicate predicate) {
    List<Employee> employees = employeeService.listEmployees(predicate);
    return new ResponseEntity<>(employees , HttpStatus.OK);
}

我使用 spring runner 进行单元测试。我的单元测试看起来像

@Test
public void test_listEmployees() throws Exception {
    List<Employee> employees = singletonList(employee);

   given(employeeService.listEmployees(any(Predicate.class))).willReturn(employees);

    mockMvc.perform(get(EMPLOYEE_PATH)
            .contentType(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$", hasSize(1)))
            .andExpect(jsonPath("$[0].employeeId", is(employee.getEmployeeId())))
            .andExpect(jsonPath("$[0].employeeName", is(employee.getEmployeeName())));
}

在单元测试执行时,我得到以下异常。

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.querydsl.core.types.Predicate]: Specified class is an interface

at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:65)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:160)
at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:127)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:127)
at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:108)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:127)
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:127)
at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:155)

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.querydsl.core.types.Predicate]: Specified class is an interface
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:99)
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:141)
at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:81)
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:101)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:158)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:128)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
... 47 more

任何帮助将不胜感激。

编辑

我的控制器类被注释了

@RestController
@RequestMapping(value = "employees")

并且我的控制器方法带有注释

@RequestMapping(
        method = RequestMethod.GET
)

【问题讨论】:

  • 我认为你必须自动装配谓词或创建一个真实的谓词并将其提供给方法。
  • 不能自动装配谓词,而必须创建它的实例。它没有用。
  • 为什么不能自动装配谓词?您不能创建谓词本身的实例。它是一个界面。
  • @Maz,你的控制器是怎么注释的?
  • @Patrick,它说我自动装配时找不到 bean 定义。

标签: spring-boot integration-testing predicate querydsl


【解决方案1】:

休息了几天,试图理解这个问题,我发现这不是 mockito given 函数的问题。相反,这是mockmvc.perform 操作的问题。我通过在我的测试类中添加 spring-data-commons 包中的 @EnableSpringDataWebSupport 注释来解决它。

欢呼吧

【讨论】:

    猜你喜欢
    • 2021-05-14
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多