文章目录基本问题1. 测试什么2. 什么期望3.如何处理依赖问题4.如何进行5.有什么用什么时候写未解决的问题遵循的原则让一个程序员明确的知道自己的方法不会有问题如何写哪些需要写之前一直不太理解单元测试的作用也没有写过太多的单元测试最近做了一个抽奖项目写单元测试的时候发现自己对这一块了解太少了所以借着这次机会对单元测试进行了实践。基本问题1. 测试什么我理解单元测试是主要针对某个方法如果几个方法是解决了一个问题也可以针对几个方法但是这样的话其实方法写的是有问题的要遵守单一职责的原则。单元测试的第一个重点测试一个方法如果非非非常必要可以多个2. 什么期望测试某个方法如果给定确定的输入会不会产生预期的输出。比如一个转换大小写的方法输入a那么预期输出就是A。单元测试的第二个重点明确自己的期望知道自己要测试那些问题3.如何处理依赖问题一个正常的单元测试首先就是要有Mock的数据然后需要Mock方法中的依赖输出最后才是看是不是方法允许是不是符合预期。我的理解是测试的方法调用其它方法应该通过Mock的方式只需要模拟各种返回值。单元测试的第三个重点Mock测试方法中调用的其他方法注意不论是远程还是本地的依赖方法都应该通过Mock的方式。这些依赖的方法同样需要使用单元测试保证运行复合预期。4.如何进行如果是私有方法通过反射的方式测试如果是公共方法 直接调用5.有什么用测试代码废话。。。代码变更后可以跑下测试看看是否还符合自己的预期如果每个方法的单元测试都是符合我们预期的那么整合起来会有问题如果真的会出现问题可能要从业务的角度去多考虑因为每个方法都符合了预期当然也可能是单元测试没有考虑到某个问题导致单元测试不全面什么时候写很多地方都说单元测试要在撸码之前写我觉得确实这样但是要考虑几个因素如果要在开发之前写那么一定要做好设计每个方法的输入和输出都要考虑到这还是挺有挑战性的。并且还要有最基本的方法流程。目前来说前后端分离会进行同步开发所以如果一开始就写单元测试肯定会推迟联合调试的时间对一个快速开发的团队来说后台压力会比较大一边写方法一边写单元测试没有尝试过这种暂时没有感受但是如果写完一个方法就去写测试接着写另外的方法。这样看来还不错不会因为自己的方法导致团队的开发出现阻塞自己的方法被队友调用。全部撸完再写本次就是这种方法开发下来最多的感受是写单元测试的过程中发现BUG需要修改代。。。。未解决的问题单元测试的方法调用同类的方法如何Mock私有方法的测试如何捕获异常遵循的原则一定要写单元测试架构能力强可以之前写一边开发一边写会简单一些记住自己要测试的只是当前方法的行为不相关的依赖方法Mock这些依赖方法会有自己的测试方法改完代码跑一遍单元测试让一个程序员明确的知道自己的方法不会有问题如何写/** * 获取奖品 * 期望1:如果有一般奖品获得奖品 * 期望2:如果没有一般奖品,2.1获取默认奖品 2.2:返回没有奖品 * 期望3:如果奖品数量为0或小于0返回Optional.Empty() */TestpublicvoidgetAwardTest(){finalintdefaultTotalNum100;finalintzero0;//这里是Mock数据when(drugsGenerateService.getTotalNum()).thenReturn(defaultTotalNum).thenReturn(defaultTotalNum).thenReturn(zero);when(drugsGenerateService.getAllAwards()).thenReturn(getTestAwards()).thenReturn(newArrayList());finalintdefaultAwardNum100;AwardDTO defaultAwardAwardDTO.builder().isDefault(true).desc(默认奖品).num(defaultAwardNum).build();when(drugsGenerateService.getDefaultAward()).thenReturn(Optional.of(defaultAward)).thenReturn(Optional.empty());//期望1:如果有一般奖品获得奖品OptionalAwardDTOawardOptionaldrugsLotteryDrawService.getAward();Assert.assertTrue(awardOptional.isPresent());Assert.assertTrue(!awardOptional.get().getIsDefault());//期望2.1 获取默认奖品OptionalAwardDTOawardOptional2drugsLotteryDrawService.getAward();Assert.assertTrue(awardOptional2.isPresent());Assert.assertTrue(awardOptional2.get().getIsDefault());//期望2.2:返回没有奖品OptionalAwardDTOawardOptional3drugsLotteryDrawService.getAward();Assert.assertTrue(!awardOptional3.isPresent());//期望3:如果奖品数量为0或小于0返回Optional.Empty()OptionalAwardDTOawardOptional4drugsLotteryDrawService.getAward();Assert.assertTrue(!awardOptional4.isPresent());}一开始要明确自己的期望Mock需要的数据Mock工具验证自己的期望哪些需要写逻辑复杂的方法逻辑简单但是会频繁改动方法改动很容易影响单元测试的期望我的个人博客,有空来坐坐