`

spring autowired mockito单元测试

阅读更多

service层会自动注入(autowired)dao层的interface,如何正常测试service层的逻辑,而不真正的触动dao层的代码,即不往数据库做实际操作,变成了一个需要解决的问题。首先,看一下我们service层的代码:

 

[java] view plain copy
 
  1. public interface RegisterUserService {    
  2.     boolean insert(String passid,String msisdn,String email) throws SQLException;  
  3.       
  4. }  

 

[java] view plain copy
 
  1. @Service("registerUserService")  
  2. public class RegisterUserServiceImpl implements RegisterUserService {  
  3.   
  4.     private Logger loggor = Logger.getLogger(getClass());  
  5.   
  6.       
  7.   
  8.     @Autowired  
  9.     private UserMapper userMapper;  
  10.   
  11.     @Autowired  
  12.     private PassidUserMapper passidUserMapper;  
  13.   
  14.     @Autowired  
  15.     @Qualifier("redisService")  
  16.     private CacheService redisService;  
  17.   
  18.       
  19.   
  20.     @Override  
  21.     @Transactional  
  22.     public boolean insert(String passid, String msisdn, String email)  
  23.             throws SQLException {  
  24.         if (StringUtils.isEmpty(passid))  
  25.             return false;  
  26.   
  27.         User user = new User();  
  28.         if (!StringUtils.isEmpty(msisdn))  
  29.             user.setPhoneNo(msisdn);  
  30.         if (!StringUtils.isEmpty(email))  
  31.             user.setEmail(email);  
  32.   
  33.         PassidUser passidUser = new PassidUser();  
  34.         String serverCode = ServerCodeConfig.serverCodeMap  
  35.                 .get(PayUtil.ipAddress);  
  36.         if (StringUtils.isEmpty(serverCode)) {  
  37.             serverCode = "999";  
  38.         }  
  39.         String userid = serverCode + UIDUtil.next();  
  40.         passidUser.setUserid(userid);  
  41.         passidUser.setPassid(passid);  
  42.   
  43.         user.setPassid(passid);  
  44.         user.setUserid(userid);  
  45.         Date date = new Date();  
  46.         user.setCreateTime(date);  
  47.         user.setUpdateTime(date);  
  48.         user.setDeleteFlag(0);  
  49.   
  50.         /*if(loggor.isInfoEnabled()){ 
  51.             loggor.info("passid:" + passid + "  userid:" + userid + "  msisdn:" 
  52.                     + msisdn + "  email:" + email); 
  53.         }*/  
  54.   
  55.         int result = passidUserMapper.insert(passidUser);  
  56.   
  57.         if (passidUserMapper.insert(passidUser) > 0  
  58.                 && userMapper.insertSelective(user) > 0)  
  59.             redisService.set("passid:" + passid + ":userid", userid);  
  60.         else  
  61.             throw new SQLException("数据插入失败,数据回滚");  
  62.   
  63.         return true;  
  64.     }  
  65.   
  66. }  

 

 

从代码中可以看到,service层的RegisterUserServiceImpl实现了interface RegisterUserService,在这个service中注入了userMapper,PassidUserMapper和RedisService,我们需要mock掉这三个autowired的真实行为,做spring相关的测试,我们选用的mockito进行,实现较为方便,在做spring mockito测试时,需要引入以下dependency :

 

[html] view plain copy
 
  1.       <dependency>  
  2.            <groupId>org.mockito</groupId>  
  3.            <artifactId>mockito-all</artifactId>  
  4.            <version>1.10.19</version>  
  5.        </dependency>  
  6.        <dependency>  
  7.            <groupId>junit</groupId>  
  8.            <artifactId>junit</artifactId>  
  9.            <version>4.12</version>  
  10.        </dependency>  
  11. <dependency>  
  12.            <groupId>org.springframework</groupId>  
  13.            <artifactId>spring-test</artifactId>  
  14.            <version>${spring.version}</version>  
  15.        </dependency>  


使用@InjectMock置入需要测试的RegisterUserServiceImpl,如下:

 

 

[java] view plain copy
 
  1. @InjectMocks  
  2. private RegisterUserService registerUserService = new RegisterUserServiceImpl();  

对于需要mock掉的dao层的interface使用@Mock注入:

 

 

[java] view plain copy
 
  1. @Mock  
  2. private UserMapper userMapper;  
  3.   
  4. @Mock  
  5. private PassidUserMapper passidUserMapper;  
  6.   
  7. @Mock  
  8. private CacheService redisService;  

 

 

注入后,需要对RsgisterUserService和UserMapper,PassidUserMapper,RedisService绑定:

 

[java] view plain copy
 
  1. MockitoAnnotations.initMocks(this);  

同时,我们期望UserMapper和PassidMapper的功能得到想要的结果:

 

 

[java] view plain copy
 
  1. when(passidUserMapper.insert(any(PassidUser.class))).thenReturn(1);  
  2. when(userMapper.insertSelective(any(User.class))).thenReturn(1);  

完整的单元测试代码如下:

 

 

[java] view plain copy
 
  1. @RunWith(SpringJUnit4ClassRunner.class)  
  2. @WebAppConfiguration  
  3. @ContextConfiguration("file:src/main/resources/conf/springConfig.xml")  
  4. public class RegisterUserServiceImplTest {  
  5.   
  6.     @InjectMocks  
  7.     private RegisterUserService registerUserService = new RegisterUserServiceImpl();  
  8.   
  9.     @Mock  
  10.     private UserMapper userMapper;  
  11.   
  12.     @Mock  
  13.     private PassidUserMapper passidUserMapper;  
  14.   
  15.     @Mock  
  16.     private CacheService redisService;  
  17.   
  18.     @Before  
  19.     public void setUp() {  
  20.         MockitoAnnotations.initMocks(this);  
  21.         when(passidUserMapper.insert(any(PassidUser.class))).thenReturn(1);  
  22.         when(userMapper.insertSelective(any(User.class))).thenReturn(1);  
  23.     }  
  24.   
  25.     @Test  
  26.     public void testInsert() throws Exception {  
  27.         String passid = "12344";  
  28.         String msisdn = "18867131210";  
  29.         String email = "test@test.cn";  
  30.         Assert.assertTrue(registerUserService.insert(passid, msisdn, email));  
  31.   
  32.     }  
  33. }  

 

http://blog.csdn.net/u011236357/article/details/51197965

分享到:
评论

相关推荐

    spring集成TestNG与Mockito框架单元测试方法

    本篇文章将深入探讨如何在Spring项目中集成TestNG和Mockito进行单元测试。 TestNG是一个强大的测试框架,它扩展了JUnit的功能,提供了更灵活的测试配置,如并发测试、更丰富的注解、更详尽的测试报告等。首先,你...

    spring MVC junit 单元测试(controller)

    在Spring MVC框架中,单元测试是确保代码质量的重要步骤,特别是在控制器层(Controller)。这篇博客主要探讨了如何使用JUnit进行Spring MVC Controller的单元测试。在实际开发中,单元测试可以帮助我们尽早发现潜在...

    spring mvc的简单单元测试

    Spring MVC 是一个强大的Java web开发框架,用于构建可维护、可扩展的...总之,通过正确使用JUnit、Mockito、Spring Test以及MockMVC,我们可以编写出全面、有效的Spring MVC单元测试,确保代码质量并降低潜在的bug。

    07. Spring Boot单元测试

    在Spring Boot框架中,单元测试是一项至关重要的任务,它能够帮助开发者确保代码的正确性和可靠性。Spring Boot提供了方便的工具和库,使得编写和执行单元测试变得简单高效。本章节我们将深入探讨Spring Boot中的...

    Spring3单元测试和集成测试

    在Spring框架中,单元测试和...通过上述内容,我们可以了解到Spring3中如何进行单元测试和集成测试,以及如何结合Mockito等工具来编写更高效的测试。理解并熟练运用这些测试技术,将有助于提高代码质量,降低维护成本。

    Spring Boot中的单元测试.pdf

    在Spring Boot中,单元测试是确保代码质量和可维护性的重要组成部分。通过单元测试,开发者能够独立验证代码的各个部分,确保它们按照预期工作,并在修改代码后快速发现潜在问题。Spring Boot为此提供了一系列便利...

    27. Spring Boot Junit单元测试【从零开始学Spring Boot】

    在Spring Boot框架中,单元测试是一项至关重要的任务,它能够帮助开发者确保代码的质量,提前发现潜在问题,并且便于持续集成和重构。本篇内容将基于"27. Spring Boot Junit单元测试【从零开始学Spring Boot】"的...

    spring单元测试

    总结起来,通过Java配置的Spring Web项目,我们可以利用JUnit、Mockito以及H2数据库轻松地进行单元测试。对于Controller层,我们使用`@WebMvcTest`注解;对于Service层,我们结合`@MockBean`和`@Autowired`创建mock...

    SpringBoot 多模块 Serivce 层单元测试

    本文将深入探讨如何在IDEA中对Spring多模块项目中的Service层进行单元测试。 首先,我们需要理解Spring Boot的多模块架构。一个标准的Spring Boot多模块项目通常包括以下部分:父模块(parent)、应用主模块...

    Spring对于业务层的单元测试支持

    其中,Spring对于业务层的单元测试和集成测试提供了丰富的工具和功能,使得开发者能够更加高效地对代码进行验证和调试。本文将深入探讨Spring如何帮助我们进行业务层的测试。 首先,单元测试主要关注的是单个类或...

    Junit 单元测试完整案例

    本案例涵盖了Spring和Struts两大框架的单元测试,旨在帮助开发者掌握如何对这两个流行的Java Web框架进行有效的测试。 一、Junit基础 1. Junit简介:Junit是一款开源的、基于Java的测试框架,由Ernst Leifer和Kent...

    Spring整合Junit框架进行单元测试Demo

    除了基本的单元测试,我们还可以结合Mockito、PowerMock等库进行更高级的测试,如模拟静态方法、私有方法或final类。这些工具可以帮助我们处理那些难以直接测试的代码。 总之,Spring整合JUnit进行单元测试是一个...

    基于TestNG+Mockito及自动装配注解的Spring MVC集成测试

    Mockito是一个流行的Java单元测试框架,用于创建和管理模拟对象(mock objects)。在集成测试中,我们可能不希望依赖于真实的数据库或外部服务,这时Mockito可以帮助我们模拟这些依赖,以便专注于测试目标代码的行为...

    Spring Boot中的单元测试.docx

    在Spring Boot中进行单元测试通常依赖于一系列的测试框架和工具,包括但不限于JUnit、Spring Test、Mockito等。 - **JUnit**:是Java中最常用的单元测试框架之一,提供了强大的断言机制和灵活的测试组织方式。 - **...

    SpringBoot项目中使用Mockito的示例代码

    在Spring Boot项目中使用Mockito是非常有用的,它可以帮助我们更好地进行单元测试和集成测试。在本文中,我们将通过示例代码来介绍如何在Spring Boot项目中使用Mockito, 以及它的优点和注意事项。 什么是Mockito?...

    spring-demo15-测试.zip

    本示例“spring-demo15-测试”主要聚焦于Spring框架中的测试部分,通过一系列的实例,深入探讨如何有效地进行Spring应用的单元测试和集成测试。 1. **Spring测试模块** Spring框架提供了内置的测试支持,包括`...

    spring3学习笔记(2)-集成ibatis3进行单元测试

    在Spring中,我们可以使用JUnit和Mockito等工具进行单元测试。针对iBatis的测试,通常会涉及到以下几个步骤: 1. 配置测试环境:创建一个专门为测试用的配置文件,如`test-context.xml`,在这个配置文件中,我们...

Global site tag (gtag.js) - Google Analytics