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 = "[email protected]";  
  30.         Assert.assertTrue(registerUserService.insert(passid, msisdn, email));  
  31.   
  32.     }  
  33. }  

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

猜你喜欢

转载自aoyouzi.iteye.com/blog/2343725