2021-01-11

博客园Logo
首页
新闻
博问
专区
闪存
班级
代码改变世界
搜索
注册
登录
返回主页
程序猿DD
Spring Boot | Spring Cloud | 干货分享
博客园首页新随笔联系订阅管理随笔 - 121 文章 - 0 评论 - 77
文件上传的单元测试怎么写?
早上有个群友问了一个不错的问题:文件上传的单元测试怎么写?后面也针对后端开发要不要学一下单元测试的话题聊了聊,个人是非常建议后端开发能够学一下单元测试的。所以,今天特地拿出来写一篇说说,并不是因为这有多难写,而是作为出色的后端开发人员,单元测试如果你能考虑周到,那么从代码结构,程序质量上都会有很大的提升。而实际开发过程中,很少有开发人员会特别关注这个方面。

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

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

@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目录:

Github:https://github.com/dyc87112/SpringBoot-Learning/
Gitee:https://gitee.com/didispace/SpringBoot-Learning/
如果您觉得本文不错,欢迎Star支持,您的关注是我坚持的动力!

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

好文要顶 关注我 收藏该文
程序猿DD
关注 - 2
粉丝 - 200
+加关注
00
« 上一篇: Spring Boot 2.x基础教程:多个文件的上传
posted @ 2021-01-11 10:39 程序猿DD 阅读(137) 评论(0) 编辑 收藏
刷新评论刷新页面返回顶部
登录后才能发表评论,立即 登录 或 注册, 访问 网站首页
【推荐】阿里出品,对标P7!限时免费,七天深入MySQL实战营报名开启
【推荐】大型组态、工控、仿真、CADGIS 50万行VC++源码免费下载
【推荐】AWS携手博客园为开发者送福利,注册立享12个月免费套餐
【推荐】第一个NoSQL数据库,在大规模和一致性之间找到了平衡
【推荐】七牛云新老用户同享 1 分钱抢 CDN 1TB流量大礼包!
【推荐】了不起的开发者,挡不住的华为,园子里的品牌专区
【推荐】未知数的距离,毫秒间的传递,声网与你实时互动

相关博文:
· 记录二:tensorflow2.0写MNIST手写体
· 重写Dijkstra
· README.md编写
· 未写完
· 我想随便写写东西。
» 更多推荐…

最新 IT 新闻:
· 能刷好评也能删差评 大众点评变味了?
· 前懂球帝CTO许立强日前正式加入字节跳动 曾担任百度主任架构师
· 82万的新车一月连撞两车 女司机称刹车失灵!特斯拉:你去告我们
· 比宝马5系贵2万多!秦力洪:蔚来ET7订单达预期 不会降价
· 泄露代码曝光Windows 10 21H2 RTM完成时间:今年最重大版本
» 更多新闻…
公告
关注公众号
→「技术干货」每日推送
→「免费资料」随时领取
→「每月福利」抽奖活动
→「加入社群」技术交流

推荐写博神器 OpenWrite

我的专栏
精心整理的系列内容,系统化学习点这里!

全网Star最多的Spring Boot教程
全网最早的Spring Cloud教程
我的仓库
开源课程的代码案例,一些原创的开源项目,看看是否有你需要的,点击关注我吧!

Github
Gitee
我的书籍
沉淀成书的东东!

《Spring Cloud微服务实战》
昵称: 程序猿DD
园龄: 6年8个月
粉丝: 200
关注: 2
+加关注
< 2021年1月 >
日 一 二 三 四 五 六
27 28 29 30 31 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 1 2 3 4 5 6
搜索

常用链接
我的随笔
我的评论
我的参与
最新评论
我的标签
我的标签
java(43)
Spring Cloud(27)
架构(21)
微服务(21)
Spring Cloud Alibaba(20)
spring boot(19)
Nacos(13)
Sentinel(6)
限流(6)
后端(3)
更多
随笔分类
Spring Boot(23)
Spring Cloud(27)
随笔档案
2021年1月(6)
2020年12月(10)
2020年11月(7)
2020年10月(1)
2020年9月(3)
2020年8月(3)
2020年7月(9)
2020年6月(3)
2020年5月(1)
2020年4月(1)
2020年3月(6)
2020年2月(6)
2020年1月(1)
2019年12月(2)
2019年10月(6)
更多
最新评论

  1. Re:Spring Cloud Alibaba到底坑不坑?
    用过一次 Spring, 再也不愿意碰。
    Spring 带来的复杂性,超过它带来的好处,不值得用。

–Jacklondon Chen
2. Re:为什么 StackOverflow 上的代码片段会摧毁你的项目?
在CSDN如何一句评论毁掉一篇博客↓↓↓ 这篇文章对你有帮助吗?作为一名程序工程师,在评论区留下你的困惑或你的见解,大家一起来交流吧!…
–清晨_Ye
3. Re:为什么 StackOverflow 上的代码片段会摧毁你的项目?
2020年最后一天能看到有人写出这个来,是值得炫耀的一件事,谨慎copy

–一日游戏
4. Re:为什么 StackOverflow 上的代码片段会摧毁你的项目?
之前CSDN搜索看到一段代码,看起来没问题,但是就是不生效。后面搜了一圈,发现CSDN跟其他博客都是互相抄,以为这段代码没问题,排查其他方面,花了好长时间。后面发现大家博客都是相互抄,都少抄了引号,导…
–everfight
5. Re:为什么 StackOverflow 上的代码片段会摧毁你的项目?
不假思索的拿来主义很坑。。。

–灯塔下的守望者
阅读排行榜

  1. Spring Cloud Alibaba到底坑不坑?(51768)
  2. Spring Cloud Alibaba基础教程:Nacos的集群部署(10503)
  3. Spring Cloud Alibaba基础教程:Nacos配置的多文件加载与共享配置(9370)
  4. Spring Cloud Alibaba基础教程:使用Nacos作为配置中心(9348)
  5. Spring Cloud Alibaba与Spring Boot、Spring Cloud之间不得不说的版本关系(8872)
    评论排行榜
  6. Spring Cloud Alibaba到底坑不坑?(13)
  7. 7月编程语言排行榜来了,为什么不同媒体报道的结果不一样?(8)
  8. 独立博客,从零到千万访问,这三年我都做了什么(6)
  9. 开源大阅兵:盘点那些走向世界的中国项目(5)
  10. 为什么 StackOverflow 上的代码片段会摧毁你的项目?(4)
    推荐排行榜
  11. Spring Cloud Alibaba到底坑不坑?(20)
  12. 开源大阅兵:盘点那些走向世界的中国项目(13)
  13. 独立博客,从零到千万访问,这三年我都做了什么(12)
  14. 全网Star最多(近20k)的Spring Boot开源教程 2019 年要继续更新了!(11)
  15. 你这辈子最引以为傲的是什么?(8)
    Copyright © 2021 程序猿DD
    Powered by .NET 5.0 on Kubernetes
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个获取当前日期时间,并将它以“XXXX年XX月XX日 hh:mm:ss”的格式输出打印的示例代码: ```java import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; public class DateUtils { // 获取当前日期时间,并将它以“XXXX年XX月XX日 hh:mm:ss”的格式输出打印 public static void showCurrentDateTime() { DateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); Date date = new Date(); String dateTime = dateFormat.format(date); System.out.println(dateTime); } // 计算并显示若干天后的日期值 public static void showDateAfterDays(String currentDate, int days) { DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); try { Date date = dateFormat.parse(currentDate); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.DAY_OF_YEAR, days); Date newDate = calendar.getTime(); String newDateString = dateFormat.format(newDate); System.out.println(newDateString); } catch (ParseException e) { e.printStackTrace(); } } // 计算并显示两个日期之间相距的天数 public static void showDaysBetweenDates(String date1, String date2) { DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); try { Date startDate = dateFormat.parse(date1); Date endDate = dateFormat.parse(date2); long diff = endDate.getTime() - startDate.getTime(); long diffDays = diff / (24 * 60 * 60 * 1000); System.out.println(diffDays); } catch (ParseException e) { e.printStackTrace(); } } } ``` 使用示例: ```java public static void main(String[] args) { // 获取当前日期时间,并将它以“XXXX年XX月XX日 hh:mm:ss”的格式输出打印 DateUtils.showCurrentDateTime(); // 计算并显示若干天后的日期值 DateUtils.showDateAfterDays("2021-01-01", 10); // 计算并显示两个日期之间相距的天数 DateUtils.showDaysBetweenDates("2021-01-01", "2021-01-11"); } ``` 输出结果: ``` 2021年05月01日 15:23:45 2021-01-11 10 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值