版本历史html |
|||
-android |
-数据库 |
-框架 |
-ide |
该教程主要讲解 Mockito 框架在Eclipse IDE 中的使用 单元测试
目录 测试
使用 Mockito 进行测试 1 this
1. 需求知识 2 google
2. 使用 存根(Stub) 和 模拟对象(Mock Object) 进行测试 2
2.2. 存根(Stub) vs. 模拟对象 (Mock) 2
该教程须要理解单元测试和熟悉JUnit 框架的使用。
若是您不熟悉 JUnit,请阅读 JUnit 教程。
一个单元测试须要在隔离的环境下执行。若是能够的话须要消除其余依赖的服务影响。但实际上,软件中是充满依赖关系的.咱们会基于service类写操做类,而service类又是基于数据访问类(DAOs)的,依次下去.
为了解决这个问题, 可使用 存根 (Stub) 或者 模拟 (Mock) 对象的方法进行测试。
存根(Stub)类是实现了一个接口或者抽象类的类,能够在测试过程当中使用该类,例如:
package cn.nsccsz.stub;
public class TestStub {
static interface USB {
void work();
}
static class Mp3Stub implements USB {
@Override
public void work() {
// code.
}
}
static class Mp4Stub implements USB {
@Override
public void work() {
// code.
}
}
}
一个模拟对象(mock object)是一个接口或者抽象类的虚拟实现。例如:
public class TestMock {
static interface USB {
void work();
}
@Test
public void testMockObject() {
USB usb = Mockito.mock( USB.class );
usb.work();
}
}
存根和模拟对象均可以传递给其余的对象进行测试。你的一些单元测试能够测这些类的正确性等。利用存根对象或者模拟对象能够保证测试过程当中不受到其余的影响。
存根对象须要自定义实现方法;
模拟对象只须要更少的代码和简单的配置。
如下的内容将详细介绍模拟对象的使用方法。
Mock 对象容许你对行为进行测试。有一些测试不须要验证结果,可是须要检查某些方法是否被正确的参数调用过。这种测试为行为测试。
状态测试只是关注与结果是否正确,而行为测试可以判断一个应用调用结构以及层次。
大家可使用Mock 框架来生成模拟对象。Mock 框架容许你在运行期间建立对象,而且定义它的一些行为。
一个典型的例子就是使用模拟对象来模拟数据库DAO层。在生产环境上是使用运行的数据库,可是在单元测试环境中彻底能够用模拟对象来模拟数据,确保单元测试的正确条件。这样就不须要依赖于外部的数据。
比较流行的模拟框架有 EasyMock、jMock 和 Mockito。下面的列表是这些框架的连接。
# jMock
http://jmock.org/
# EasyMock
http://easymock.org/
# Mockito
http://code.google.com/p/mockito/
Mockito 是比较流行的模拟框架,能够与JUnit 联合起来测试。它容许你进行建立和配置模拟对象。
Mockito的官方网站: Mockito 主页.
Mockito 支持使用 mock() 静态方法建立模拟对象。
一样也支持 @Mock注解方式,若是使用注解的方式,须要使用在初始化方法调用 MockitoAnnotation.InitMock( this ) 方法
For example, the following code demonstrate the usage of Mockito to test a class called ClassToTest.
例如,下面的例子就是使用 Mockito 进行对类 ClassToTest 的单元测试。
public class MockitoTest {
@Mock
MyDatabase databaseMock;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
@Test
public void testQuery() {
// 须要测试的类
ClassToTest t = new ClassToTest(databaseMock);
// 调用方法
boolean check = t.query("* from t");
// 验证结果
assertTrue(check);
// 模拟对象是否调用了该方法
Mockito.verify( databaseMock ).query("* from t");
}
可使用静态导入方法调用方法 mock()
Mockito 如下的类型不能进行构造:
Mockito 可使用 verify() 方法来确认某些方法是否被调用过.
when(....).thenReturn(....) 结构能够为某些条件给定一个预期的返回值.
@Test
public void testList() {
List mock = Mockito.mock( List.class );
Mockito.when( mock.get( 0 ) ).thenReturn( 1 );
assertEquals( "预期返回1", 1, mock.get( 0 ) );
}
一样可使用doReturn(object).when(kdskfsk).methodCall 结构
Mockito 跟踪了全部的方法调用和参数的调用状况。verify()能够验证方法的行为。
查看下面的例子:
@Test
public void testMap() {
Map mock = Mockito.mock( Map.class );
Mockito.when( mock.get( "city" ) ).thenReturn( "深圳" );
// test code
assertEquals( "城市测试", "深圳", mock.get( "city" ) );
Mockito.verify(mock).get( Matchers.eq( "city" ) );
Mockito.verify( mock, Mockito.times( 2 ) );
}
@Spy 或者方法 spy() 能够包含一个真实的对象. 每次调用,除非特出指定,委托给改真实对象的调用.
@Test
public void testSpy() {
// Lets mock a LinkedList
List list = new LinkedList();
list.add( "yes" );
List spy = Mockito.spy(list);
//You have to use doReturn() for stubbing
assertEquals( "yes", spy.get( 0 ) );
Mockito.doReturn("foo").when(spy).get(0);
assertEquals( "foo", spy.get( 0 ) );
}
@Test( expected = IndexOutOfBoundsException.class)
public void testSpy2() {
// Lets mock a LinkedList
List list = new LinkedList();
List spy = Mockito.spy(list);
// this would not work
// real method is called so spy.get(0)
// throws IndexOutOfBoundsException (list is still empty)
Mockito.when(spy.get(0)).thenReturn("foo");
assertEquals( "foo", spy.get( 0 ) );
}
Mockito 一样也能够在安卓平台上进行测试。
在 Android 测试项目中使用 Mockito。添加下面的包到Android 测试项目的 libs 目录
https://mockito.googlecode.com/files/mockito-all-1.9.5.jar
http://dexmaker.googlecode.com/files/dexmaker-1.0.jar
http://dexmaker.googlecode.com/files/dexmaker-mockito-1.0.jar
After you make the libraries available you can use Mockito in your tests.
接下来能够在你的测试项目中使用 Mockito 。
感谢阅读该教程:
Mockito 项目主页