SpringBootTest使用Mock测试文件上传

 

@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class OssControllerTest {
    @Autowired
    private WebApplicationContext wac;

    private MockMvc mvc;

    @Before
    public void setupMockMvc(){
        mvc = MockMvcBuilders.webAppContextSetup(wac).build(); //初始化MockMvc对象
    }

    @Test
    public void uploadFilePublic() throws Exception {
        File file = new File("C:\\Users\\Administrator\\Desktop\\xxxx.jpg");
        //文件之外的参数
        String key = "/2019/12/18/"+file.getName();        MockMultipartFile firstFile = new MockMultipartFile("file", "xxxx.jpg",
                MediaType.TEXT_PLAIN_VALUE, new FileInputStream(file));

        mvc.perform(MockMvcRequestBuilders.fileUpload("/ossService/uploadFilePublic")
                .file(firstFile)//文件
                .param("key", key))//参数
                .andExpect(MockMvcResultMatchers.status().isOk());
        LogUtils.info("文件的key为:"+key);
    }


}

参考博客:http://tobato.iteye.com/blog/2315174

### Spring Boot 中模拟 MultipartFile 示例 在 Spring Boot 中,`MultipartFile` 是一个接口,用于处理文件上传操作。为了在测试或某些特定场景下模拟 `MultipartFile` 对象,可以通过实现该接口或者使用工具类来构造。以下是具体的实现方式。 #### 1. 使用自定义类模拟 MultipartFile 通过创建一个实现 `MultipartFile` 接口的类,可以手动设置文件的相关属性,例如文件名、内容类型和字节流等[^2]。 ```java import org.springframework.web.multipart.MultipartFile; import java.io.*; public class MockMultipartFile implements MultipartFile { private final String name; private final String originalFilename; private final String contentType; private final byte[] content; public MockMultipartFile(String name, String originalFilename, String contentType, byte[] content) { this.name = name; this.originalFilename = originalFilename; this.contentType = contentType; this.content = content; } @Override public String getName() { return this.name; } @Override public String getOriginalFilename() { return this.originalFilename; } @Override public String getContentType() { return this.contentType; } @Override public boolean isEmpty() { return this.content == null || this.content.length == 0; } @Override public long getSize() { return this.content.length; } @Override public byte[] getBytes() throws IOException { return this.content; } @Override public InputStream getInputStream() throws IOException { return new ByteArrayInputStream(this.content); } @Override public void transferTo(File dest) throws IOException, IllegalStateException { try (OutputStream out = new FileOutputStream(dest)) { out.write(this.content); } } } ``` #### 2. 在测试使用 MockMultipartFile 以下是一个简单的单元测试示例,展示如何在测试使用 `MockMultipartFile` 模拟文件上传[^2]。 ```java import org.junit.jupiter.api.Test; import org.springframework.mock.web.MockMultipartFile; import org.springframework.web.multipart.MultipartFile; import static org.junit.jupiter.api.Assertions.assertEquals; public class FileUploadTest { @Test public void testMockMultipartFile() throws Exception { // 创建一个模拟的 MultipartFile 对象 String content = "This is a test file content."; MultipartFile multipartFile = new MockMultipartFile( "file", "test.txt", "text/plain", content.getBytes() ); // 验证文件内容 assertEquals("test.txt", multipartFile.getOriginalFilename()); assertEquals("text/plain", multipartFile.getContentType()); assertEquals(content.getBytes().length, multipartFile.getSize()); assertEquals(content, new String(multipartFile.getBytes())); } } ``` #### 3. 使用 Spring 提供的 MockMultipartFile 工具类 Spring 提供了 `MockMultipartFile` 类,可以直接用于测试环境中的文件上传模拟。 ```java import org.springframework.mock.web.MockMultipartFile; import org.springframework.web.multipart.MultipartFile; public class AnotherFileUploadTest { public MultipartFile createMockFile() { // 使用 Spring 提供的 MockMultipartFile 构造文件对象 return new MockMultipartFile( "file", "mock-file.txt", "text/plain", "Mock file content".getBytes() ); } } ``` ### 注意事项 - 如果项目未引入 Spring 框架,则无法直接使用 `MultipartFile` 类及其相关功能[^1]。 - 在实际开发中,确保文件内容的大小和格式符合业务需求,并进行充分的边界测试
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值