使用 MockMvc 测试发送带有文件的对象

问题描述 投票:0回答:1

我想将一个对象发送到控制器,该对象具有多个包含文件的列表和多个包含纯文本的字段。

public class ContributionNew<T extends MovieInfoDTO> {
    private List<T> elementsToAdd;
    private Map<Long, T> elementsToUpdate;
    private Set<Long> idsToDelete;
    private Set<String> sources;
    private String comment;
}

public class Photo extends MovieInfoDTO {
    private MultipartFile photo;
}

@PostMapping(value = "/{id}/contributions/photos")
@ResponseStatus(HttpStatus.CREATED)
public
ResponseEntity<Void> createPhotoContribution(
        @ApiParam(value = "The movie ID", required = true)
        @PathVariable("id") final Long id,
        @ApiParam(value = "The contribution", required = true)
        @RequestBody @Valid final ContributionNew<Photo> contribution
) {

我想创建一个测试来发送对象,但我不知道如何完成它。

@Test
public void testCreatePhotoContribution() throws Exception {
    ContributionNew<Photo> contribution = new ContributionNew<>();
    MockMultipartFile multipartFile = new MockMultipartFile("photo", "C:\\Users\\Jonatan\\Pictures\\2.png",
            "image/png", "Spring Framework".getBytes());
    Photo.Builder photoBuilder = new Photo.Builder(
            multipartFile
    );
    contribution.getElementsToAdd().add(photoBuilder.build());

    mockMvc
            .perform(post("/api/v1.0/movies/{id}/contributions/photos", 1)
                .contentType(...)
                .content(...))
            .andExpect(status().isCreated());
}

我不知道如何为传输的数据设置正确的类型,设置内容。仅有关仅发送文件(不在对象中)的教程可用。但没有指南表明文件是对象中的字段之一。怎么办?

java spring spring-mvc testing mockmvc
1个回答
0
投票

对于那些想知道的人: 您可以发送 MultipartFile 和一些纯文本字段,以映射到控制器中的 1 个对象。看看我的例子。 达:

public class NewFileInfoDto {
    @NotNull
    @Positive()
    private Long requestId;
    @NotNull
    private MultipartFile file;
}

控制器:

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public FileInfoDto addFile(@ModelAttribute @Valid NewFileInfoDto dto) {
        return fileService.addFile(dto);
    }

测试部分:

mockMvc.perform(multipart("/file")
                        .file(file)
                        .param("requestId", "3")
                        .accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isCreated());
    ```

© www.soinside.com 2019 - 2024. All rights reserved.