JUnit是一个开源的Java单元测试框架,由 Erich Gamma 和 Kent Beck 开发完成。java
主要是为了方便开发人员在本身开发的过程当中可以及时的发现和解决bug用的,一方面本身能够经过单元测试及时解决掉一些存在的问题,另外一方面对于部门或者小组来讲,你们若是都把验证的工做放在联调上面,那将会是个灾难性的工做。尤为是涉及到扯皮的事情的时候,充分的自验证可以给你带来底气和减小加班的时间的,因此学习单元测试仍是很是有必要滴。c++
这里我采用的是maven快速工程的形式搭配junit来作测试:apache
大概步骤:new一个快速启动的maven工程(配置网上一大堆),pom文件主要是引用了junit以下所示:框架
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>exercise</groupId> <artifactId>exercise.test</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.2</version> <type>jar</type> <scope>test</scope> </dependency> </dependencies> </project>
工程结构以下:maven
其中Book为一个Bean,有名称和价格两个属性。Library为一个图书馆,提供插入书籍、返回书单、返回总价格等接口。LibraryTest为图书馆的测试类,咱们这里仅仅测试两个主要的函数。ide
其中Book类代码以下,注意若是想判断两个Book对象是否相等须要重写equal函数:函数
1 package bean; 2 3 public class Book { 4 5 private String name; 6 private int price; 7 8 public Book(){ 9 10 } 11 public Book(String name,int price){ 12 this.name=name; 13 this.price=price; 14 } 15 16 17 public String getName() { 18 return name; 19 } 20 public void setName(String name) { 21 this.name = name; 22 } 23 public int getPrice() { 24 return price; 25 } 26 public void setPrice(int price) { 27 this.price = price; 28 } 29 30 /** 31 * 当须要比较两个对象是否相等的时候须要重载equal和hashCode函数 32 */ 33 @Override 34 public boolean equals(Object o) { 35 if (o instanceof Book) { 36 return (this.name == ((Book)o).getName()&&this.price==((Book)o).getPrice()); 37 } 38 39 return false; 40 } 41 42 @Override 43 public int hashCode() { 44 return 1; 45 } 46 }
Library代码以下,单元测试
1 package service; 2 3 import java.util.ArrayList; 4 import java.util.Collections; 5 import java.util.List; 6 7 import bean.Book; 8 9 public class Library { 10 11 private List<Book> bookList = new ArrayList<Book>(); 12 13 public Library(){ 14 15 } 16 17 public Library(List<Book> bookList){ 18 this.bookList=bookList; 19 } 20 21 public void Store(Book book){ 22 bookList.add(book); 23 } 24 25 public void StoreAll(List<Book> bookList){ 26 this.bookList.addAll(bookList); 27 } 28 29 public List<Book> getBookList(){ 30 return bookList; 31 } 32 33 public int getPrice(){ 34 int price = 0; 35 for(Book book:bookList) 36 { 37 price+=book.getPrice(); 38 } 39 return price; 40 } 41 }
libraryTest代码以下:学习
1 package service_test; 2 3 import junit.framework.TestCase; 4 5 import java.util.ArrayList; 6 import java.util.List; 7 import org.junit.Test; 8 import service.Library; 9 import bean.Book; 10 public class LibraryTest extends TestCase{ 11 12 13 @Test 14 public void testGetBookList() { 15 Library library = new Library(); 16 List<Book> bookList = new ArrayList<Book>(); 17 bookList.add(new Book("c++",10)); 18 bookList.add(new Book("java",20)); 19 library.StoreAll(bookList); 20 assertEquals(library.getBookList().get(0), new Book("c++",10)); 21 } 22 23 @Test 24 public void testGetPrice() { 25 Library library = new Library(); 26 library.Store(new Book("c++",10)); 27 library.Store(new Book("java",20)); 28 assertEquals(library.getPrice(), 30); 29 } 30 31 }
运行结果以下:测试
改个值从新运行以下:
删除了Book类里面的equal函数之后,从新运行以下:
能够看到Junit经过本地构造数据实现与main方法同样的运行方式,但不管是间接性仍是可读性都要强的多,并且测试类能够选择TestCase或者直接引入静态引用也能够,经过反编译能够看到junit里面都是一些静态方法,而测试类里面采用标注的方式进行运行
这只是最简单的测试方法,下一步还有一些mock即打桩数据的方法来应对更复杂的应用场景,下次再写。