- Introduction
- Quick Start
- Design
- Tutorial
- Spring MVC
- JSP/JSTL/Servlet
- JQuery and plugins
- Ajax
- Twitter Bootstrap CSS
- SiteMesh
- YUICompressor
- Spring Restful Service
- JAX-WS/CXF
- Spring Data JPA
- JPA/Hibernate
- MyBatis
- Database
- H2 Database
- Datasource
- Transaction
- Redis
- Cache Overview
- Guava Cache
- Ehcache
- Memcached
- Shiro Security
- Crypto
- Schedule/Quartz
- Jmx
- System Protection
- Hystrix
- Rate Limiter
- Monitoring and Metrics
- Metrics-library
- Graphite
- Logging/Slf4j/Logback
- Logstash
- Spring
- Validation Overview
- JQuery Validation
- Hibernate Validator
- General Utilizes
- JSON/JAXB
- Date
- Test Overview
- Unit Test/Mockito/AssertJ
- Selenium2
- BDD
- Performace-test
- JMeter
- Profiler
- Simulator Overview
- Nodejs
- Eclipse
- Maven
- Sonar
- git
- Travis CI
- Jetty
- Micro-Service Architecture/Executable War
- AssertJ
- CreateNewProject
- Dozer
- Graphite-Windows
- Hello-Everybody
- Jaxb
- Json
- Mock
Mock
1. Mockito
Mockito 有着比EasyMock更优雅的API。
与EasyMock比,它分开了设定返回值的stub语句与验证mock被调用过的verify函数,两者不再连在一起,不再需要那种记录,然后replay()的语句,而是需要分别独立编写。
使用示例见quickstart中的AccoutServiceTest. 当然,Mockito的基本原理还是用cglib生成子类.
创建Mock对象
原始写法:
public class AccountManagerTest {
private AccountManager accountManager ;
private UserDao mockedUserDao;
public void setUp(){
mockedDao = Mockito.mock(UserDao.class);
accountManager = new AccountManager();
accountManager.setUserDao(mockedUserDao);
}
更优雅的写法:
public class AccountManagerTest {
@@InjectMocks
private AccountManager accountManager;
@Mock
private UserDao mockedUserDao;
public void setUp(){
MockitoAnnotations.initMocks(this);
}
stub函数
Mockito.when(mockedList.get(Mockito.anyInt())).thenReturn("element");
如果你懒,不写任何stub设定,所有mock调用都返回Null。没返回值函数的更加根本不用写stub。 参数的模糊匹配很多时候很有用, 注意只要一个参数用了模糊匹配,所有参数都要用匹配语法,如果还有某个参数想精确控制就用eq().
Mockito.verify(mock).someMethod(Mockito.anyInt(), Mockito.eq("second parameter"));
如果要设定没返回值函数抛异常,不再需要easyMock那种奇怪的expectLastCall了,直接写.
Mockito.doThrow(new RuntimeException()).when(mock).clear();
Stub的最高级境界之一,使用Answer接口,计算输入参数来决定返回值
when(mock.someMethod(anyString())).thenAnswer(new Answer() {
Object answer(InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
return "called with arguments: " + args;
}
});
System.out.println(mock.someMethod("foo"));
Stub的最高级境界之二,spy 真实Object,只stub其中部分的方法,其他方法继续真实的跑。
List list = new LinkedList();
List spy = Mockito.spy(list);
//optionally, you can stub out some methods:
when(spy.size()).thenReturn(100);
//using the spy calls *real* methods
spy.add("one");
verfiy函数:
简单的校验
Mockito.verify(mockUserDao).delete(2L);
如果要确认mock的方法没有被执行过
Mockito.verify(mockUserDao, Mockito.never()).delete(1L);
verify的最高境界之一,使用capture()把输入参数记下来再慢慢判断。
ArgumentCaptor<Person> argument = ArgumentCaptor.forClass(Person.class);
verify(mock).doSomething(argument.capture());
assertEquals("John", argument.getValue().getName());
2. PowerMock
Mockito对构造函数, 静态方法和final方法是无解的,此时需要JMockit或PowerMock来救场。因为JMockit是另一套mock API体系,而PowerMock的功能比较纯粹,只负责解决static,final的问题,而API与Mockito/EasyMock是兼容的,所以选了它。
与Mockito结合的完整示例
在SpringSide里的使用示例见spring-test中的WebDriverFactoryTest,对构造函数进行了Mock.
有个问题是PowerMock一般用PowerMockRunner来激活, 那些Spring applicationContext aware(见下)的测试也有自己的Runner. 这个时 候,就要用PowerMock的JunitRule,见 http://code.google.com/p/powermock/wiki/PowerMockRule 。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论