Mockito单元测试
ElephantTest 类:
package ut;
import static org.mockito.BDDMockito.then;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import org.junit.Assert;
import org.junit.Test;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
/**
* Mock测试就是在测试过程中,对于一些不容易构造(如HttpServletRequest必须在Servlet容器中才能构造出来)
* 或者说获取比较复杂的对象(如JDBC中的ResultSet对象)或者说我们并不需要关注的对象,
* 用一个虚拟的对象(Mock对象)来创建方便测试的测试方法。
*
* Mock最大的功能是可以帮我们把单元测试的耦合分解开,如果代码中对另一个类或接口有依赖,
* 它就能帮你模拟这些依赖,并帮你验证所调用的依赖的行为。
*
* Java中目前主要的Mock测试工具有Mockito,JMock,EasyMock等等,很多Java Mock库如
* EasyMock或JMock都是expect-run-verify(期望-运行-测试)的方式,
* 而Mockito则更简单:在执行后的互动中提问。使用Mockito主要记住,在执行前stub,而后在交互中验证即可。
*
* Stub(桩)对象:提供测试时所需要的测试数据,可以对各种交互设置相应的回应(设置方法调用的返回值等),
* 可以通过Mockito中的when()thenReturn()来设置方法调用的返回值。
*
* Mock对象:验证测试中所依赖的对象间的交互是否能达到预期,通过verify().methodXX()语法来验证是否按照预期被调用。
*
* Mockito是单元测试的利器,对多种测试场景有良好的支持。
*/
public class ElephantTest {
@Test
public void test_mockito(){
// 模拟List的对象
List mockList = mock(List.class);
// 模拟request请求对象
HttpServletRequest request = mock(HttpServletRequest.class);
when(request.getParameter("foo")).thenReturn("boo");
when(mockList.get(0)).thenReturn(1);
Assert.assertEquals("预期返回1",1,mockList.get(0));
}
@Test
public void test_perform() {
Elephant elephant = spy(new Elephant("foo"));
elephant.perform("friday");
verify(elephant).makeNoise();
}
/**
* 否定测试
*/
@Test
public void test_not_make_sound_perform(){
Elephant elephant = spy(new Elephant("foo"));
elephant.perform("monday");
// verify(elephant,never()).makeNoise();
then(elephant).should(never()).makeNoise();
}
}
pom.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<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>org.example</groupId>
<artifactId>myCode</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.10.19</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
</dependencies>
</project>
Animal 类:
package ut;
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
}
Elephant类:
package ut;
public class Elephant extends Animal {
public Elephant(String name){
super(name);
}
public void makeNoise(){
System.out.println("elephant make sound");
}
public void perform(String day){
if (day.equals("thursday") || day.equals("friday")){
makeNoise();
}
}
}