【问题标题】:SCC doesn't support Pageable?SCC 不支持可分页?
【发布时间】:2017-07-04 05:12:00
【问题描述】:

我正在使用 Spring Cloud Contract (1.1.0),但是当我想使用时我完全卡住了 可分页

http://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/domain/Pageable.html

以下示例正在运行,没有可分页

@GetMapping("/employees")
@Timed
public List<EmployeeDTO> getAllEmployees() {
    log.debug("REST request to get all Employees");
    List<Employee> employees = employeeRepository.findAll();
    return employeeMapper.employeesToEmployeeDTOs(employees);
}

而这个正在使用可分页

@GetMapping("/employees")
@Timed
public ResponseEntity<List<EmployeeDTO>> getAllEmployees(@ApiParam Pageable pageable)
    throws URISyntaxException {
    log.debug("REST request to get a page of Employees");
    Page<Employee> page = employeeRepository.findAll(pageable);
    HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "/api/employees");
    return new ResponseEntity<>(employeeMapper.employeesToEmployeeDTOs(page.getContent()), headers, HttpStatus.OK);
}

我的合同在这里。为第一个示例工作,而不是为第二个示例工作

import org.springframework.cloud.contract.spec.Contract
[
Contract.make {
    name("get all")
    request {
        method 'GET'
        url('/api/employees?sort=id,desc')

    }
    response {
        status 200
        body([
            [id : 1,
            firstName : value(consumer('test'), producer(regex('[a-zA-Z0-9]{1,255}'))),
            lastName : value(consumer('test'), producer(regex('[a-zA-Z0-9]{1,255}'))),
            phoneNumber : value(consumer('test'), producer(regex('[a-zA-Z0-9]{1,255}'))),
            salary : value(consumer(1000), producer(regex('[0-9]{1,10}'))),
            commissionPct : value(consumer(1000), producer(regex('[0-9]{1,10}')))
            ],
            [id : 2,
            firstName : value(consumer('test2'), producer(regex('[a-zA-Z0-9]{1,255}'))),
            lastName : value(consumer('test2'), producer(regex('[a-zA-Z0-9]{1,255}'))),
            phoneNumber : value(consumer('test2'), producer(regex('[a-zA-Z0-9]{1,255}'))),
            salary : value(consumer(2000), producer(regex('[0-9]{1,10}'))),
            commissionPct : value(consumer(2000), producer(regex('[0-9]{1,10}')))
        ]

        ])
        headers {
            contentType('application/json;charset=UTF-8')
        }
    }
}
]

还有堆栈跟踪:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.domain.Pageable]: Specified class is an interface
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:99)
    at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:142)
    at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:80)
    at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:102)
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:160)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:129)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:116)
    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:963)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
    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:790)
    at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167)
    at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134)
    at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:155)
    at com.jayway.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.performRequest(MockMvcRequestSenderImpl.java:174)
    at com.jayway.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.sendRequest(MockMvcRequestSenderImpl.java:404)
    at com.jayway.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.get(MockMvcRequestSenderImpl.java:582)
    at com.jayway.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.get(MockMvcRequestSenderImpl.java:79)
    at com.jayway.restassured.module.mockmvc.internal.MockMvcRequestSpecificationImpl.get(MockMvcRequestSpecificationImpl.java:744)
    at com.jayway.restassured.module.mockmvc.internal.MockMvcRequestSpecificationImpl.get(MockMvcRequestSpecificationImpl.java:66)
    at org.springframework.cloud.contract.verifier.tests.EmployeeTest.validate_get_all(EmployeeTest.java:47)

我该怎么办?我应该修改什么才能使其正常工作?

【问题讨论】:

    标签: spring-cloud-contract


    【解决方案1】:

    但是您到底想达到什么目的?您在示例中展示的内容实际上是包含两个元素的单个主体。那是你想要发送的吗?或者你想要第一次调用第一个元素,然后是第二个。如果是这种情况,那么您将使用场景 http://cloud.spring.io/spring-cloud-contract/1.0.x/#_scenarios 进行有状态案例。您需要签订 2 份单独的合同。

    另一个问题是您是否真的需要测试分页是否有效。您想测试合同是否有效,并且只发送一次请求(或者我错过了您想要测试的东西?)。

    更新:

    我认为这与 Spring Data + Rest Assured 有关。请查看这个问题 - Isolated Controller Test can't instantiate Pageable

    【讨论】:

    • 我只是为 url 签订合同:/api/employees?sort=id,desc' 元素只是我的合同的回报。而且我不想测试我的寻呼,因为它正在工作并且我知道,我只想使用它的合同
    • 你能把你的样本贴在某个地方让我检查一下吗?
    • 也许 Spring Data 在这种情况下需要一个真实的上下文而不是模拟的?你试过插件中的 EXPLICIT 模式吗?
    • 我应该自定义生成的测试吗?还是我的基类?
    • 到基类。不能修改生成的测试
    【解决方案2】:

    使用 Pageable 参数,Spring Data Rest 可以识别排序参数:http://docs.spring.io/spring-data/rest/docs/current/reference/html/#paging-and-sorting.sorting

    但是在使用 Contract 进行单元测试时,无法创建 Pageable,因为它是一个接口...

    【讨论】:

      猜你喜欢
      • 2020-12-21
      • 2021-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      相关资源
      最近更新 更多