这里略去maven工程的配置,以及junit在maven工程中的配置和使用;也不分析Mock的原理和Mockito与其他mock工具的异同。
重点讲解如何在maven junit中引入Mockito,以及使用mock完成单元测试。
1.添加Mockito依赖
在pom.xml中添加dependency:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.9.0</version>
<scope>test</scope>
</dependency>
版本可能需要注意下,这里Mockoito使用1.9,junit是4.7
保存后maven会自动从仓库中download:
17-12-21 下午02时52分06秒: Downloading http://repo1.maven.org/maven2/org/mockito/mockito-all/1.9.0/mockito-all-1.9.0.pom
17-12-21 下午02时52分06秒: Downloaded http://repo1.maven.org/maven2/org/mockito/mockito-all/1.9.0/mockito-all-1.9.0.pom
17-12-21 下午02时52分07秒: Downloading http://repo1.maven.org/maven2/org/mockito/mockito-all/1.9.0/mockito-all-1.9.0.jar
17-12-21 下午02时52分09秒: Downloaded http://repo1.maven.org/maven2/org/mockito/mockito-all/1.9.0/mockito-all-1.9.0.jar
后面在代码中引入Mockito即可。
2.单元测试中使用Mockito
假设有如下方法需要测试:
public int sumX(int a, int b){
return 0;
}
对应的测试代码大致如下:
private Calculator test;
@Before
public void setUp() throws Exception {
test = new Calculator();
}
@Test
public void testSumX() {
assertEquals(2, test.sumX(1, 1));
}
执行junit test,如无意外结果肯定是fail:
下面使用mock,使该单元测试通过:
首先引入Mockito
import org.mockito.Mockito;
使用Mockito
大致类似:
Type mock = Mockito.mock(Type.class);
然后设定返回值或者抛出异常:
when(mock.func(args).thenReturn(XXX);
when(mock.func(args).thenThrow(new RuntimeException());
上面案例中如下:
import org.mockito.Mockito;
@Test
public void testSumX() {
Calculator mock = Mockito.mock(Calculator.class);
Mockito.when(mock.sumX(1, 1)).thenReturn(2);
assertEquals(2, mock.sumX(1, 1));
}
mock sumX方法使其当输入为(1, 1)时返回2,然后再跟之前junit测试一样调用断言进行判断;重新执行junit test发现pass了
3.小结
当然实际测试中,mock不是这么用的,不是用来将错误的返回改成期望返回值,而是使用mock工具模拟一些在应用中不容易构造或者比较复杂的对象,从而把测试目标与测试边界以外的对象隔离开。
本文旨在介绍如何在maven junit工程中引入和使用Mockito,所以仅以此为例。