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即打樁數據的方法來應對更復雜的應用場景,下次再寫。