Как сделать модульный тест составным с запросом PUT, используя Spring MVC и Spock?

У меня есть такой контроллер:

@RestController
@RequestMapping('/v1/document')
class DocumentV1Controller {
  @PutMapping
  HttpEntity<Document> newdoc(
    @RequestHeader Map<String, String> headers, @RequestParam('document') MultipartFile multipartFile) {
  }
}

И я хочу протестировать его с помощью Spring MVC Test и Spock, но я просто не могу понять, как создать MockMultipartHttpServletRequestBuilder изменение HttpMethod с запроса POST на PUT.

Это спецификация Спока:

class DocumentV1ControllerSpec extends BaseControllerSpec {
  Should 'test and document good request on /v1/document endpoint'() {
    given:
      File file = new File('./src/test/resources/demoC.csv')
      MockMultipartFile multipartFile = new MockMultipartFile('file',file.getBytes())
    when:
      ResultActions result = mockMvc.perform(fileUpload('/v1/document')
        .file(multipartFile))
    then:
      result.andExpect(status().isCreated())
  }
}

Ошибка, которую я получаю, заключается в следующем:

java.lang.AssertionError: Status expected:<201> but was:<405>
at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:60)
at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:89)
at org.springframework.test.web.servlet.result.StatusResultMatchers$10.match(StatusResultMatchers.java:664)
at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:171)
at gus.rest.api.v1.DocumentV1ControllerSpec.test and document good request on /v1/document endpoint(DocumentV1ControllerSpec.groovy:61)

Что я могу сделать, чтобы заставить его работать?


person Juan Caleb Rizo Vilchis    schedule 18.05.2016    source источник


Ответы (1)


Я не эксперт в spock, однако метод fileUpload теперь устарел для Spring (в версии 5.*).

Существует способ изменить метод POST по умолчанию для MockMultipartHttpServletRequestBuilder на PUT:

class DocumentV1ControllerSpec extends BaseControllerSpec {
  Should 'test and document good request on /v1/document endpoint'() {
    given:
      File file = new File('./src/test/resources/demoC.csv')
      MockMultipartFile multipartFile = new MockMultipartFile('file', file.getBytes())

      MockMultipartHttpServletRequestBuilder multipart = (MockMultipartHttpServletRequestBuilder) multipart('/v1/document').with(request -> {
        request.setMethod(HttpMethod.PUT);
        return request;
      });
    when:
      ResultActions result = mockMvc.perform(multipart
        .file(multipartFile))
    then:
      result.andExpect(status().isCreated())
  }
}

Хитрость заключается в том, чтобы использовать with(RequestPostProcessor postProcessor) для изменения запроса и установки для него метода PUT.

person heroin    schedule 23.01.2019