说到单元测试真的很让人抓狂,先说说我理解的单元测试的好处:
1.帮助自己整理代码的结构,更加清楚的认识代码的逻辑。
2.单元测试相当于debug的过程,尤其是在没有IDE开发的
3.在分布式开发的过程中,经常会多人同时合作编写代码的时候保护自己的代码。
4.便于小组合作时代码的责任分配问题。
junit4框架介绍
首先介绍最常用5个标签
@BeforeClass@Before @Test @After @AfterClass
其中@BeforeClass和@AfterClass标记静态方法,且在编译测试代码的时候只执行一次。
@Before@Test @After根据testcase的个数决定执行次数。
然后说说junit的基本的API------Rule、Assume、Assert
其中Assert比较常用,用于判断结果是否和预先设定的值相等。
AssertTrue、AssertFalse:结果的true、false。
AssertThat:使用Matcher做自定义的校验。
AssertEquals、AssertNotEquals:判断两个对象是否相等。
AssertNull、AssertNotNull:判断对象是否为空。
AssertSame:判断两个对象是否为同一个,不同于equals这里是使用“==”判断。
AssertArrayEquals:判断两个数组是否相等。
对Rule和Assume用的不多,一般Rule是测试用例执行过程中一些通用功能的共享,比如verify方法校验测试结果(如文件、结果是否更改等),ExpectedException异常测试,Timeout用来控制method的执行时间,具体可以看看这个博客:http://my.oschina.net/pangyangyang/blog/146015
谈谈单元测试与mock的关系:
一般深层测试,比如需要链接到外部节点或者需要链接外部数据库,可以用junit现有API解决,这种测试依赖于外部,一旦没有网络,或者外部依赖改变,测试代码无法进行。还有一种测试叫smock测试,当你不需要外部依赖的时候,或者多人合作时有复杂的依赖关系,则使用mockito虚拟对象,并且将虚拟对象注射到测试类中实现无外部依赖的测试,好处是使用mock出来的对象写的test完全与外部类的实现隔离了,依赖的类改变内容没有改变形式,只要test能跑过则证明自己逻辑没有问题,更改代码的小伙伴就要你的代码,或者依赖的类改变类的方法形式,导致test不能跑过,则更改代码的小伙伴也要更改你的代码以及test,总之写test不仅能更好的理解代码逻辑,还能保护住自己的代码。
对于mock的理解,mock的对象知道原来类中有的方法的形式,但是不知道方法的具体实现,所以mock出来的对象需要定义方法的返回值。一般用mockito.when().thenReturn()的形式,给mock出来的对象返回值,使得每一步都是自己手动调试过程。
这里介绍下google开发的PowerMockito,PowerMockito是mock的升级版本,可以测试静态类和final类,对应的API可以参考 https://code.google.com/p/powermock/wiki/MockitoUsage13
但是单元测试中会遇到private类,还有继承抽象类或者接口的类。
其中private类的测试可以用java的反射获得私有方法,然后测试
对于继承抽象类或者接口的,不能mock或者new抽象类或者接口,只能new子类,并在子类里实现父类方法的测试。
可以参考github上的代码:https://github.com/wendy926/ProgramByWendy