我们都会编写单元测试程序,但我们当前所面临的挑战是被测单元可能依赖于其他组件。而对于单元测试配置其他组件,绝对是过枉矫正。相反,我们可以使用Mocks框架代替其他组件,继续进行单元测试。
为了展现如何使用mock框架,我编写一个数据访问层(DAL),该类对应用提供了一套API 接口来访问和修改数据库中的数据。之后在不需要连接数据库的情况下,对DAL类进行单元测试。数据库可以是本地数据库、远程数据库、文件系统或者任何可以储存和检索数据的地方。使用DAL类帮助我们 将数据映射操作从应用代码中分离出来。
使用maven建立一个Java工程。
mvn archetype:generate -DgroupId=info.sanaulla -DartifactId=MockitoDemo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
以上操作建立了一个MockitoDemo文件夹,然后创建源文件和测试文件的整个目录结构。
考虑下面这个示例模型类:
package info.sanaulla.models;
import java.util.List;
/**
* Model class for the book details.
*/
public class Book {
private String isbn;
private String title;
private List authors;
private String publication;
private Integer yearOfPublication;
private Integer numberOfPages;
private String image;
public Book(String isbn,
String title,
List authors,
String publication,
Integer yearOfPublication,
Integer numberOfPages,
String image){
this.isbn = isbn;
this.title = title;
this.authors = authors;
this.publication = publication;
this.yearOfPublication = yearOfPublication;
this.numberOfPages = numberOfPages;
this.image = image;
}
public String getIsbn() {
return isbn;
}
public String getTitle() {
return title;
}
public List getAuthors() {
return authors;
}
public String getPublication() {
return publication;
}
public Integer getYearOfPublication() {
return yearOfPublication;
}
public Integer getNumberOfPages() {
return numberOfPages;
}
public String getImage() {
return image;
}
}
操作Book模型类的DAL类:
package info.sanaulla.dal;
import info.sanaulla.models.Book;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* API layer for persisting and retrieving the Book objects.
*/
public class BookDAL {
private static BookDAL bookDAL = new BookDAL();
public List getAllBooks(){
return Collections.EMPTY_LIST;
}
public Book getBook(String isbn){
return null;
}
public String addBook(Book book){
return book.getIsbn();
}
public String updateBook(Book book){
return book.getIsbn();
}
public static BookDAL getInstance(){
return bookDAL;
}
}
当前DAL层以上没有任何功能,我们将对这段代码TDD进行单元测试。DAL层可能与ORM映射API或者数据库API通讯,而我们不关心的这些API是如何设计的。
测试驱动DAL层
对单元测试和Java Mock有很多框架,对这个例子,我将选择JUnit做单元测试,Mockito作为Java mock。我们会在Maven的pom.xml文件中更新依赖属性。
使用maven命令: mvn test进行测试。输出如下:
T E S T S
Running info.sanaulla.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.029 sec
Running info.sanaulla.dal.BookDALTest
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.209 sec
Results :
Tests run: 5, Failures: 0, Errors: 0, Skipped: 0
至此,通过使用mock框架,在不用实际配置数据源的情况下,就可以测试DAL类。