Mockito,测试框架,语法简单,功能强大!
静态、私有、构造等方法测试需要配合PowerMock,PowerMock有Mockito和EasyMock两个版本,语法相同,本文只介绍Mockito.
测试对像:ArticleManager
ArticleManager 类
publicclassArticleManager{void setDatabase(ArticleDatabase database){...}Stringget(String val){
database.get(val);}String add(String val){
database.set(val);}}
ArticleDatabase 类
publicclassArticleDatabase{Stringget(String val){...}String add(String val){...}}
注解
@Mock
创建Mock对像
@MockprivateArticleDatabase ds;
实例ds是一个虚拟对像,ds对像本身的所有方法返回值都为Null。
@InjectMocks
@InjectMocksprivateArticleManager articleManager;
将现有Mock对像(ds)注入到articleManager,支持方法包括constructor, setter, property 和 Spring的@Autowired !
@Captor
参数调用截取器
//定义@Captor,如果要获取多个参数, 需要定义多个@Captor@CaptorprivateArgumentCaptor<String> argumentString;
articleManager.add("content");
verify(ds, times(1)).add(argumentString.capture());//打印参数值
logger.debug(argumentString.getValue());
@Spy
Mock类的部分真实或定制后调用。没有定制的方法就调用真实的方法。
@SpyprivateArticleManager articleManager2;//定制方法,这个地方用`when`还会调用真实的方法后返回定制结果//见:http://docs.mockito.googlecode.com/hg/latest/org/mockito/Spy.html
doReturn("0").when(articleManager2).get(0);
articleManager2.get(0);
verify(articleManager2).get(0);//调用真实的方法
articleManager2.get(1)
verify(articleManager2).get(1);
@Spy
真实调用也可以用@Mock
对像thenCallRealMethod
方法调用:
when(articleManager2.get(2)).thenCallRealMethod();
Stubbing
特别制定Mock对像某方法的返回值、类型或异常等,默认是Null,
when(ds.get(0)).thenReturn("first");when(ds.get(1)).thenThrow(newRuntimeException());
verify
对某方法返回结果的校验,包括调用次数,返回值等
articleManager.add("one");
verify(ds).add("one");
参考:@Captor
模糊匹配
在Stubbing或verify里可用模糊匹配来适配多种情况的调用,Mockito在包org.mockito.Matchers下提供有anyString(), anyInt()或者直接anyObject()等大量模糊匹配函数,如果有需要还可自己写,实现(org.hamcrest.Matcher)。 例:
when(articleManager.get(anyString())).toReturn("element");System.out.println(articleManager.get("1"));
verify(articleManager).get(anyString());
在使用校验函数verify时,参数如果有模糊匹配则所有参数都要用模糊匹配,如:
//正确的写法:
verify(mock).articleManager(anyInt(), anyString(), eq("third argument"));//错误用法:
verify(mock).articleManager(anyInt(), anyString(),"third argument");
更多模糊匹配函数请参考:http://mockito.googlecode.com/svn/branches/1.8.5/javadoc/org/mockito/Matchers.html
1自动生成Mock类
在需要Mock的属性上标记@Mock注解,然后@RunWith(MockitoJUnitRunner.class)或者在setUp()方法中显示调用MockitoAnnotations.initMocks(this);生成Mock类即可。
2自动注入Mock类到被测试类
只要在被测试类上标记@InjectMocks,Mockito就会自动将标记@Mock、@Spy等注解的属性值注入到被测试类中。
@InjectMocks的问题是:如果被测试类是代理类,那么注入会失效。比如上面的UserService如果是事务或者其他AOP代理类,那么进入@Test方法时UserService中的DAO属性不会被Mock类替换。
3 Mock方法定制再也不用录制、播放了
Mockito的Mock方法定制可读性很强,而且也不需要像EasyMock那样录制播放,定制后就可以使用。
例如:
when(userDao.selectAll()).
thenReturn(Collections.<UserDomain>emptyList());
4有些方法想Mock定制,有些想调用真实方法
因为@Mock针对接口生成Mock类,所以我们是没法调用到真实的实现类的方法。可以使用@Spy注解标注属性,并且标注@Resource注解让Spring注入真实实现类,那么Mockito就会自动生成Spy类。
例如:
@InjectMocks
@Resource(name ="userService")
privateUserService userService;
@Spy
@Resource
privateUserDao userDao;
Spy类就可以满足我们的要求。如果一个方法定制了返回值或者异常,那么就会按照定制的方式被调用执行;如果一个方法没被定制,那么调用的就是真实类的方法。
如果我们定制了一个方法A后,再下一个测试方法中又想调用真实方法,那么只需在方法A被调用前,调用Mockito.reset(spyObject);就行了。
输出为:
0
0
Real Test1()!!! - 1
Real Test2()!!! - 2
Real Test1()!!! - 100
Real Test1()!!! - 1
Real Test2()!!! - 2
Real Test1()!!! - 104
要注意的是,对Spy对象的方法定制有时需要用另一种方法:
===============================================================================
Importantgotcha on spying real objects!
Sometimes it's impossible to usewhen(Object) for stubbing spies. Example:
List list = new LinkedList();
List spy = spy(list);
//Impossible: real method is called so spy.get(0) throwsIndexOutOfBoundsException (the list is yet empty)
when(spy.get(0)).thenReturn("foo");
//You have to use doReturn() for stubbing
doReturn("foo").when(spy).get(0);
===============================================================================
因为用when(spy.f1())会导致f1()方法被真正执行,所以就需要另一种写法。
参考资料
Mockito文档
http://mockito.googlecode.com/svn/branches/1.6/javadoc/org/mockito/Mockito.html
相关推荐
Mockito 是一个流行的 Java 单元测试框架,它允许开发者创建和配置模拟对象,以便在测试中隔离被测试代码。JUnit 是一个广泛使用的 Java 测试框架,它为编写和运行可重复的单元测试提供了基础。将 Mockito 和 JUnit ...
#### 四、Mockito 实战演练 在实际项目中,假设有一个`UserService`类,它依赖于`UserRepository`类。为了测试`UserService`类的功能,我们需要创建`UserRepository`的Mock对象并设置其行为: ```java // 创建...
五、Mockito实战应用 在实际项目中,Mockito常用于测试以下场景: - 测试驱动开发(TDD):先编写测试,再实现功能。 - 单元测试:确保单个组件的正确性,不依赖其他组件。 - 隔离外部依赖:如数据库、网络服务等,...
### 实战单元测试:使用TestNG与Mockito #### 单元测试的重要性及好处 单元测试作为软件开发过程中的一个重要组成部分,在确保代码质量、提高开发效率方面起着至关重要的作用。通过编写单元测试,开发者可以对软件...
《单元测试实战:TestNG与Mockito应用解析》 单元测试是软件开发过程中的重要环节,它能够确保代码的正确性、稳定性和可维护性。TestNG和Mockito是两个非常流行的Java单元测试工具,它们提供了强大的功能和灵活的...
JUnit是Java领域常用的单元测试框架,而Mockito可以帮助我们模拟依赖,进行隔离测试。 最后,项目部署和运维也是开发者需要了解的部分。这包括了解如何配置服务器环境,使用Tomcat或Jetty等应用服务器部署Java应用...
《PowerMock实战手册》是一本专注于使用PowerMock进行单元测试的指南,结合了Junit测试框架和Mockito库,为开发者提供了全面的测试解决方案。在实际的软件开发中,单元测试是确保代码质量的重要环节,它能帮助我们找...
《Android Studio实战:快速高效地构建Android应用》是一本深入探讨Android Studio的实用指南,旨在帮助开发者提升在Android开发中的效率和质量。Android Studio作为Google官方推荐的Android应用程序开发集成开发...
JUnit是Java常用的单元测试框架,Mockito可以用来模拟依赖,而Selenium等工具则用于进行Web应用的自动化测试。 总的来说,《Java典型模块项目实战大全资料》包含了Java开发的各个方面,从基础语法到高级特性,从...
使用JUnit和Mockito等工具对SpringMVC应用进行单元测试和集成测试。 10. **RESTful API** SpringMVC支持RESTful风格的API开发,通过`@RequestMapping`的`method`属性指定HTTP方法,实现CRUD操作。 11. **AJAX与...
9. 测试驱动开发,利用JUnit和Mockito进行单元测试和集成测试。 10. 部署和优化,包括性能调优、错误处理和日志监控。 配合源代码,读者可以亲手实践这些示例,加深对Spring MVC和MyBatis的理解,进一步提高在企业...
通过源码,我们可以学习如何编写测试用例,使用Mockito、TestNG或JUnit等工具进行测试。 9. **微服务架构**:虽然《SpringBoot实战》可能不专注于微服务,但源码中可能包含如何构建和部署微服务的示例,如使用...
【集成测试实战1】主要探讨的是在IT领域中进行集成测试时的技术选型和实践,特别是针对Mock框架的选择和使用。集成测试是为了确保各个组件在实际环境中的协同工作,通过模拟不可控组件来达到测试目的。 集成测试的...
源码可能包括JUnit、Espresso或Mockito的使用,展示了如何编写单元测试和UI自动化测试。 通过深入研究这些项目案例源码,开发者不仅可以学习到具体的编程技巧,还能了解到项目架构设计、代码优化以及问题调试等多个...
6. **单元测试与集成测试**:代码中可能会包含JUnit和Mockito等测试工具的使用,以便对功能进行验证和调试,确保代码质量。 7. **持续集成/持续部署(CI/CD)**:实战可能涉及Git版本控制,Jenkins自动化构建,Docker...
丁雪丰在书中会讲解如何使用JUnit和Mockito进行单元测试,以及SpringBoot提供的集成测试支持,确保代码质量。 除此之外,书中还会介绍SpringBoot与其他流行技术的整合,例如Spring Cloud、Docker、WebSocket、...
书中也会涵盖Mockito等模拟框架的集成,它可以帮助开发者隔离被测试代码,避免依赖于其他组件。通过mock对象,我们可以精确控制测试环境,只关注待测试代码的行为。 贯穿全书的实战案例将帮助读者深入理解Junit的...
Mock接口框架的应用实战,如Mockito或WireMock,允许在测试中模拟外部依赖,减少对真实环境的依赖,提高测试速度和稳定性。通过模拟接口响应,可以专注于测试单个组件的行为,而不是整个系统的交互。 HTTP协议接口...