欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring autowired mockito单元测试 博客分类: 单元测试 springautowiredmockito单元测试 

程序员文章站 2024-02-14 21:23:52
...

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