zoukankan      html  css  js  c++  java
  • 文件上传的单元测试怎么写?

    早上有个群友问了一个不错的问题:文件上传的单元测试怎么写?后面也针对后端开发要不要学一下单元测试的话题聊了聊,个人是非常建议后端开发能够学一下单元测试的。所以,今天特地拿出来写一篇说说,并不是因为这有多难写,而是作为出色的后端开发人员,单元测试如果你能考虑周到,那么从代码结构,程序质量上都会有很大的提升。而实际开发过程中,很少有开发人员会特别关注这个方面。

    言归正传,下面我们具体说说当碰到需要上传文件的接口,我们要如何写单元测试!

    先来回忆一下,普通接口的单元测试我们是如何写的?看看我们入门例子中的单元测试:

    @SpringBootTest
    public class Chapter11ApplicationTests {
    
        private MockMvc mvc;
    
        @Before
        public void setUp() {
            mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();
        }
    
        @Test
        public void getHello() throws Exception {
            mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON))
                    .andExpect(status().isOk())
                    .andExpect(content().string(equalTo("Hello World")));
        }
    
    }
    

    这里我们所用到的核心是MockMvc工具,通过模拟http请求的提交并指定相关的期望返回来完成。

    对于文件上传接口,本质上还是http请求的处理,所以MockMvc依然逃不掉,就是上传内容发生了改变,我们只需要去找一下文件上传的模拟对象是哪个,就可以轻松完成这个任务。

    具体写法如下:

    @SpringBootTest(classes = Chapter43Application.class)
    public class FileTest {
    
        @Autowired
        protected WebApplicationContext context;
        protected MockMvc mvc;
    
        @BeforeEach
        public void setUp() {
            mvc = MockMvcBuilders.webAppContextSetup(context).build();
        }
    
        @Test
        public void uploadFile() throws Exception {
            MockMultipartFile file = new MockMultipartFile(
                    "file",
                    "hello.txt",
                    MediaType.TEXT_PLAIN_VALUE,
                    "Hello, World!".getBytes()
            );
    
            final MvcResult result = mvc.perform(
                    MockMvcRequestBuilders
                            .multipart("/upload")
                            .file(file))
                    .andDo(print())
                    .andExpect(status().isOk())
                    .andReturn();
        }
    
    }
    

    可以看到MockMvc的测试主体是不变的,无非就是请求类型和请求内容发生了改变。

    今天的这篇很水,但是否会编写单元测试以及能否写好单元测试,是很难看出一个后端开发水平的。所以,我是非常推荐大家能够在编写业务实现的时候,先考虑一下自己的单元测试是否方便写,甚至先定义好接口,并写好单元测试,再去写实现(传说中的测试驱动开发)。

    最近的分享到这里结束,有更多想法可来公众号、星球或社群交流!

    更多本系列免费教程连载「点击进入汇总目录」

    代码示例

    本文的相关例子可以查看下面仓库中的chapter4-3目录:

    如果您觉得本文不错,欢迎Star支持,您的关注是我坚持的动力!

    欢迎关注我的公众号:程序猿DD,获得独家整理的免费学习资源助力你的Java学习之路!另每周赠书不停哦~

  • 相关阅读:
    Datax streamreader json测试样例
    dbeaver 连接 elasticsearch 记录
    灾害链开发记录资料汇总
    mxgraph
    drawio www.diagrams.net 画图应用程序开发过程资料汇总
    neo4j学习记录
    GraphVis 图可视化分析组件
    D3学习记录
    Kubernetes K8S之固定节点nodeName和nodeSelector调度详解
    记一次性能优化,单台4核8G机器支撑5万QPS
  • 原文地址:https://www.cnblogs.com/didispace/p/14261012.html
Copyright © 2011-2022 走看看