转:http://www.cnblogs.com/syxchina/p/4150879.html
spring中使用mockito
1 mockito介绍和入门
官方:https://github.com/mockito/mockito
入门:
5分钟了解Mockito http://liuzhijun.iteye.com/blog/1512780
Mockito:一个强大的用于 Java 开发的模拟测试框架 http://www.oschina.net/translate/mockito-a-great-mock-framework-for-java-development
2 spring中正常使用mockito
上demo代码:
1 @RunWith(SpringJUnit4ClassRunner.class) 2 @ContextConfiguration(locations = { "classpath:testApplicationContext.xml" }) 3 public class SpringMockitoTest { 4 5 @Mock 6 private ApiService mockApiService; 7 8 @Before 9 public void initMocks() { 10 MockitoAnnotations.initMocks(this); 11 when(mockApiService.test()).thenReturn("ok"); 12 } 13 14 @Test 15 public void should_success_when_testApiService() { 16 String result = mockApiService.test(); 17 Assert.assertEquals("ok", result); 18 } 19 } 20 21 @Component 22 public class ApiService { 23 24 @Autowired 25 private TestApiService testApiService; 26 27 public String test() { 28 String connect = testApiService.connect(); 29 connect += "test";//test自己的业务 30 return connect; 31 } 32 } 33 34 @Component 35 public class TestApiService { 36 public String connect() { 37 return "error"; 38 } 39 40 public String findFromDb() { 41 return "db_data"; 42 } 43 }
正常使用spring和mockito中,我们把需要的mock的ApiService给mock掉,但是我们更想的是把TestApiService中的connect方法mock掉,这样就可以测试我们自己的代码,也就是ApiService中test方法自己的业务。
3 spring中mock任何容器内对象
上面的demo中,我们如何mock掉TestApiService中的test方法?
因为TestApiService是spring容器管理的bean,并且ApiService中使用到TestApiService,所以我们把ApiService中引用的TestApiService替换成我们的mock对象即可。
Spring框架有个反射工具ReflectionTestUtils,可以把一个对象中属性设置为新值,我们可以使用:
ReflectionTestUtils.setField(apiService, "testApiService", spyTestApiService);
把我们mock的testApiService放到apiService中,这样apiService调用就是我们mock的对象了;但是默认spring中apiService对象是代理对象,不能直接把值设置到属性上,所以我们自己写个小的工具类,在最后如下:
ReflectionTestUtils.setField(AopTargetUtils.getTarget(apiService), "testApiService", spyTestApiService);
完整demo:
1 @RunWith(SpringJUnit4ClassRunner.class) 2 @ContextConfiguration(locations = { "classpath:testApplicationContext.xml" }) 3 public class SpringMockitoTest { 4 5 @Autowired 6 private ApiService apiService; 7 @Mock 8 private TestApiService spyTestApiService; 9 @Autowired 10 private TestApiService testApiService; 11 12 @Before 13 public void initMocks() throws Exception { 14 MockitoAnnotations.initMocks(this); 15 ReflectionTestUtils.setField(AopTargetUtils.getTarget(apiService), "testApiService", spyTestApiService); 16 when(spyTestApiService.connect()).thenReturn("ok"); 17 } 18 19 @After 20 public void clearMocks() throws Exception { 21 ReflectionTestUtils.setField(AopTargetUtils.getTarget(apiService), "testApiService", testApiService); 22 } 23 24 @Test 25 public void should_success_when_testApiService() { 26 String result = apiService.test(); 27 Assert.assertEquals("oktest", result); 28 } 29 } 30 31 @Component 32 public class ApiService { 33 34 @Autowired 35 private TestApiService testApiService; 36 37 public String test() { 38 String connect = testApiService.connect(); 39 connect += "test";//test自己的业务 40 return connect; 41 } 42 } 43 44 @Component 45 public class TestApiService { 46 public String connect() { 47 return "error"; 48 } 49 50 public String findFromDb() { 51 return "db_data"; 52 } 53 } 54 55 public class AopTargetUtils { 56 /** 57 * 获取 目标对象 58 * @param proxy 代理对象 59 * @return 60 * @throws Exception 61 */ 62 public static Object getTarget(Object proxy) throws Exception { 63 if(!AopUtils.isAopProxy(proxy)) { 64 return proxy;//不是代理对象 65 } 66 if(AopUtils.isJdkDynamicProxy(proxy)) { 67 return getJdkDynamicProxyTargetObject(proxy); 68 } else { //cglib 69 return getCglibProxyTargetObject(proxy); 70 } 71 } 72 73 private static Object getCglibProxyTargetObject(Object proxy) throws Exception { 74 Field h = proxy.getClass().getDeclaredField("CGLIB$CALLBACK_0"); 75 h.setAccessible(true); 76 Object dynamicAdvisedInterceptor = h.get(proxy); 77 Field advised = dynamicAdvisedInterceptor.getClass().getDeclaredField("advised"); 78 advised.setAccessible(true); 79 Object target = ((AdvisedSupport)advised.get(dynamicAdvisedInterceptor)).getTargetSource().getTarget(); 80 return target; 81 } 82 83 84 private static Object getJdkDynamicProxyTargetObject(Object proxy) throws Exception { 85 Field h = proxy.getClass().getSuperclass().getDeclaredField("h"); 86 h.setAccessible(true); 87 AopProxy aopProxy = (AopProxy) h.get(proxy); 88 Field advised = aopProxy.getClass().getDeclaredField("advised"); 89 advised.setAccessible(true); 90 Object target = ((AdvisedSupport)advised.get(aopProxy)).getTargetSource().getTarget(); 91 return target; 92 } 93 }
最后就是注意测试之后要还原现场,把spring对象还原,尤其在跑maven test的时候,否则可能会影响其他人的测试。
注意:
Annotation的初始化
只有Annotation还不够,要让它们工作起来还需要进行初始化工作。初始化的方法为:MockitoAnnotations.initMocks(testClass)参数testClass是你所写的测试类。一般情况下在Junit4的@Before定义的方法中执行初始化工作,如下:
- @Before
- public void initMocks() {
- MockitoAnnotations.initMocks(this);
- }
详见:http://hotdog.iteye.com/blog/937862
相关推荐
Spring 中使用 Mockito 解决 Bean 依赖树问题方法 在 Spring 应用程序中,经常会遇到 Bean 依赖树问题,即在单元测试时,需要初始化 ApplicationContext,并启动 IOC 容器。但是,传统的初始化方式存在一些问题,如...
Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito ...
在Spring Boot项目中使用Mockito是非常有用的,它可以帮助我们更好地进行单元测试和集成测试。在本文中,我们将通过示例代码来介绍如何在Spring Boot项目中使用Mockito, 以及它的优点和注意事项。 什么是Mockito?...
本篇文章将深入探讨如何在Spring项目中集成TestNG和Mockito进行单元测试。 TestNG是一个强大的测试框架,它扩展了JUnit的功能,提供了更灵活的测试配置,如并发测试、更丰富的注解、更详尽的测试报告等。首先,你...
Spring集成TestNG与Mockito框架单元测试方法的文档详细介绍了如何在Java Spring项目中,利用TestNG和Mockito框架进行单元测试。这种测试方法可以帮助开发者快速上手单元测试,并确保代码质量。文档涉及了多个方面,...
Spring Framework 5,Junit和Mockito,Circle CI 该存储库包含用于在Junit和Mockito的帮助下测试任何应用程序的代码。 此存储库的CI在Circle CI的帮助下执行。 Junit测试: 基本注释测试 ClassPropertyTest ...
在IT行业中,集成测试是确保不同组件协同工作的重要环节,特别是在使用Spring MVC构建大型Web应用程序时。本篇文章将深入探讨如何结合TestNG、Mockito以及Spring的自动装配注解进行有效的集成测试。以下是对这些技术...
今天小编就为大家分享一篇关于Spring Boot单元测试中使用mockito框架mock掉整个RedisTemplate的示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
在本文中,我们将深入探讨如何在Spring Boot项目中有效地使用Mockito进行单元测试。Mockito是一个流行的Java单元测试框架,它允许我们创建和配置模拟对象,以便在测试中隔离我们想要验证的代码部分。结合Spring Boot...
- 分析具体的 Spring 测试示例,了解如何在 Spring 应用程序中使用 Mockito 进行单元测试。 通过上述知识点的详细介绍,可以看出 Mockito 不仅是一个强大的单元测试工具,而且在 TDD 和 BDD 中也发挥着重要作用。...
Packed with real-world examples, the book covers how to make Spring code testable and mock container and external dependencies using Mockito. You then get a walkthrough of the steps that will help ...
项目文件可能包含了一个简单的Spring Boot应用,其中包含了Mockito和MockMvc的使用示例。文件如`pom.xml`是项目的构建配置,`src`目录下则包含了源代码和测试代码,`target`目录用于存放编译后的类文件,`.idea`目录...
接下来,"Mockito for Spring.pdf"可能会详细讲解如何在Spring应用中使用Mockito进行测试: 1. **Mockito简介**:Mockito是一款流行的Java单元测试框架,用于创建模拟对象(mocks)。理解Mockito的基本语法和API,...
使用JUnit和Mockito进行Spring RESTful的完整性和模拟测试 这是一个Spring Boot Maven演示应用程序,展示了如何使用JUnit和Mockito Framework对Sprig Boot RESTful服务执行完整性和模拟测试。 先决条件 Java SE开发...
使用 Spring Boot、Maven 和 Mockito 的 CRUD Rest 服务演示##Introduction:这是一组 CRUD Rest API(通过基于令牌的身份验证保护)的基本演示,它具有以下功能: 从网页接收 JSON 字符串并将其存储在 mongoDB 集合...
5. 自动化测试:利用Spring Test和Mockito进行单元测试和集成测试,确保代码质量。 总之,Spring Framework 5.3.14提供了一个强大而全面的平台,用于构建现代Java应用。通过对docs、libs和schema的深入理解,开发者...
10. **测试与调试**:书中还会讨论如何使用Spring Test、Mockito等工具进行单元测试和集成测试,以及如何进行有效的Spring应用调试。 通过阅读《Spring技术内幕》,读者不仅能够理解Spring框架的底层实现,还能学习...
Spring提供了丰富的测试支持,包括单元测试、集成测试和端到端测试,可以方便地与Mockito等库配合使用,确保代码的质量。 这份《spring-reference.pdf》中文文档详细阐述了Spring框架的各个方面,对于初学者和经验...
对于测试部分,可以学习如何使用Mockito进行单元测试,以及如何利用Spring Boot Test的特性进行集成测试,比如模拟HTTP请求和数据库操作。 总的来说,SpringTest项目为我们提供了一个学习和实践Spring框架的起点,...