unit-testing - Spring MVC 4.2 : How to Unit Test Controller with @RequestPart Params

标签 unit-testing spring-mvc testing mockmvc

我有一个 requestMapping 的形式:

@RequestMapping(
    value = "/submitCase",
    consumes =  MediaType.MULTIPART_FORM_DATA_VALUE,
    produces = MediaType.APPLICATION_JSON_UTF8_VALUE,
    method = RequestMethod.POST
)
public Object submitCase(
    @RequestPart(name = "attachment[0]", required = false) MultipartFile attachment1,
    @RequestPart(name = "attachment[1]", required = false) MultipartFile attachment2,
    @RequestPart(name = "attachment[2]", required = false) MultipartFile attachment3,
    @RequestPart(name = "attachment[3]", required = false) MultipartFile attachment4,
    @RequestPart(name = "attachment[4]", required = false) MultipartFile attachment5,
    @RequestPart(name = "caseDetails") CaseDetails caseDetails) {}

现在我想用 MockMvcBuilders 为此编写一个测试。但是我无法这样做。

这里的挑战是请求处理程序使用 multipart/form-data,它由 4 个 Multipart 文件和 1 个 Json 数据组成。

关于如何解决这个问题的任何想法?请记住,我只能使用 Spring 4.3。

如果您需要更多信息,请告诉我。

最佳答案

看看这里的好例子:https://stackoverflow.com/a/21805186/3976662

请注意,MockMvcRequestBuilders.html#multipart示例中使用的在 Spring 4.3.0 中尚不可用。使用 MockMvcRequestBuilders.html#fileUpload相反(在 Spring 5 中已弃用)。

CaseDetails.java:

public class CaseDetails {
    private String exampleAttr;

    public String getExampleAttr() {
        return exampleAttr;
    }

    public void setExampleAttr(String exampleAttr) {
        this.exampleAttr = exampleAttr;
    }
}

上传 Controller .java:

@Controller
public class UploadController {

    @RequestMapping(
            value = "/submitCase",
            consumes =  MediaType.MULTIPART_FORM_DATA_VALUE,
            produces = MediaType.APPLICATION_JSON_UTF8_VALUE,
            method = RequestMethod.POST
    )
    @ResponseBody
    public Object submitCase(
            @RequestPart(name = "attachment[0]", required = false) MultipartFile attachment1,
            @RequestPart(name = "attachment[1]", required = false) MultipartFile attachment2,
            @RequestPart(name = "attachment[2]", required = false) MultipartFile attachment3,
            @RequestPart(name = "attachment[3]", required = false) MultipartFile attachment4,
            @RequestPart(name = "attachment[4]", required = false) MultipartFile attachment5,
            @RequestPart(name = "caseDetails") CaseDetails caseDetails) {

        Map<String,String> result = new HashMap<>();
        result.put("success", "true");

        return result;
    }
}

上传 Controller 测试.java:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = UploadControllerTest.TestConfig.class)
public class UploadControllerTest {

    @Autowired
    private UploadController uploadController;

    @Test
    public void testSubmitCase() throws Exception {
        MockMultipartFile file1 = new MockMultipartFile("attachment[0]", "filename-1.txt", "text/plain", "1".getBytes());
        MockMultipartFile file2 = new MockMultipartFile("attachment[1]", "filename-2.txt", "text/plain", "2".getBytes());
        MockMultipartFile file3 = new MockMultipartFile("attachment[2]", "filename-3.txt", "text/plain", "3".getBytes());
        MockMultipartFile file4 = new MockMultipartFile("attachment[3]", "filename-4.txt", "text/plain", "4".getBytes());
        MockMultipartFile file5 = new MockMultipartFile("attachment[4]", "filename-5.txt", "text/plain", "5".getBytes());

        MockMultipartFile caseDetailsJson = new MockMultipartFile("caseDetails", "", "application/json","{\"exampleAttr\": \"someValue\"}".getBytes());

        MockMvc mockMvc = MockMvcBuilders.standaloneSetup(uploadController).build();
        mockMvc.perform(MockMvcRequestBuilders.fileUpload("/submitCase")
                .file(file1)
                .file(file2)
                .file(file3)
                .file(file4)
                .file(file5)
                .file(caseDetailsJson))
                    .andDo(MockMvcResultHandlers.print())
                    .andExpect(MockMvcResultMatchers.content().string("{\"success\":\"true\"}"))
                    .andReturn();
    }

    @Configuration
    static class TestConfig {

        @Bean
        public UploadController uploadController() {
            return new UploadController();
        }
    }
}

请注意,在 UploadControllerTest 中,JSON 数据必须包装在 MockMultipartFile 中 - 相当于上传的文件。确保 jackson-corejackson-databind 在类路径中可用。

关于unit-testing - Spring MVC 4.2 : How to Unit Test Controller with @RequestPart Params,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54784950/

相关文章:

java - 提供静态资源时出现请求方法 GET 不支持错误

java - 什么 int 值用于 ServletRequestAttributes 范围?

android - 如何在android monkey test中将 Activity 添加到黑名单?

java - 我应该模拟我的测试对象与之交互的所有对象吗?

unit-testing - 从命令行运行测试时如何强制 mstest 结果覆盖结果文件

mysql - 数据保存到MYSQL DB

node.js - 在 Promise 处理程序中使用断言的好策略是什么

javascript - 将检查所有文件格式正确的测试添加到 Karma\Travis

unit-testing - Grails 3 集成测试中没有事务管理器错误

angular - 如何在 Angular Testing 中向特定测试用例注入(inject)另一个服务