service层会自动注入(autowired)dao层的interface,如何正常测试service层的逻辑,而不真正的触动dao层的代码,即不往数据库做实际操作,变成了一个需要解决的问题。首先,看一下我们service层的代码:
- public interface RegisterUserService {
- boolean insert(String passid,String msisdn,String email) throws SQLException;
- }
- @Service("registerUserService")
- public class RegisterUserServiceImpl implements RegisterUserService {
- private Logger loggor = Logger.getLogger(getClass());
- @Autowired
- private UserMapper userMapper;
- @Autowired
- private PassidUserMapper passidUserMapper;
- @Autowired
- @Qualifier("redisService")
- private CacheService redisService;
- @Override
- @Transactional
- public boolean insert(String passid, String msisdn, String email)
- throws SQLException {
- if (StringUtils.isEmpty(passid))
- return false;
- User user = new User();
- if (!StringUtils.isEmpty(msisdn))
- user.setPhoneNo(msisdn);
- if (!StringUtils.isEmpty(email))
- user.setEmail(email);
- PassidUser passidUser = new PassidUser();
- String serverCode = ServerCodeConfig.serverCodeMap
- .get(PayUtil.ipAddress);
- if (StringUtils.isEmpty(serverCode)) {
- serverCode = "999";
- }
- String userid = serverCode + UIDUtil.next();
- passidUser.setUserid(userid);
- passidUser.setPassid(passid);
- user.setPassid(passid);
- user.setUserid(userid);
- Date date = new Date();
- user.setCreateTime(date);
- user.setUpdateTime(date);
- user.setDeleteFlag(0);
- /*if(loggor.isInfoEnabled()){
- loggor.info("passid:" + passid + " userid:" + userid + " msisdn:"
- + msisdn + " email:" + email);
- }*/
- int result = passidUserMapper.insert(passidUser);
- if (passidUserMapper.insert(passidUser) > 0
- && userMapper.insertSelective(user) > 0)
- redisService.set("passid:" + passid + ":userid", userid);
- else
- throw new SQLException("数据插入失败,数据回滚");
- return true;
- }
- }
从代码中可以看到,service层的RegisterUserServiceImpl实现了interface RegisterUserService,在这个service中注入了userMapper,PassidUserMapper和RedisService,我们需要mock掉这三个autowired的真实行为,做spring相关的测试,我们选用的mockito进行,实现较为方便,在做spring mockito测试时,需要引入以下dependency :
- <dependency>
- <groupId>org.mockito</groupId>
- <artifactId>mockito-all</artifactId>
- <version>1.10.19</version>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.12</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-test</artifactId>
- <version>${spring.version}</version>
- </dependency>
使用@InjectMock置入需要测试的RegisterUserServiceImpl,如下:
- @InjectMocks
- private RegisterUserService registerUserService = new RegisterUserServiceImpl();
对于需要mock掉的dao层的interface使用@Mock注入:
- @Mock
- private UserMapper userMapper;
- @Mock
- private PassidUserMapper passidUserMapper;
- @Mock
- private CacheService redisService;
注入后,需要对RsgisterUserService和UserMapper,PassidUserMapper,RedisService绑定:
- MockitoAnnotations.initMocks(this);
同时,我们期望UserMapper和PassidMapper的功能得到想要的结果:
- when(passidUserMapper.insert(any(PassidUser.class))).thenReturn(1);
- when(userMapper.insertSelective(any(User.class))).thenReturn(1);
完整的单元测试代码如下:
- @RunWith(SpringJUnit4ClassRunner.class)
- @WebAppConfiguration
- @ContextConfiguration("file:src/main/resources/conf/springConfig.xml")
- public class RegisterUserServiceImplTest {
- @InjectMocks
- private RegisterUserService registerUserService = new RegisterUserServiceImpl();
- @Mock
- private UserMapper userMapper;
- @Mock
- private PassidUserMapper passidUserMapper;
- @Mock
- private CacheService redisService;
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- when(passidUserMapper.insert(any(PassidUser.class))).thenReturn(1);
- when(userMapper.insertSelective(any(User.class))).thenReturn(1);
- }
- @Test
- public void testInsert() throws Exception {
- String passid = "12344";
- String msisdn = "18867131210";
- String email = "test@test.cn";
- Assert.assertTrue(registerUserService.insert(passid, msisdn, email));
- }
- }
http://blog.csdn.net/u011236357/article/details/51197965
相关推荐
autowired spring autowired注解完整版 使用Spring2.5的新特性——Autowired可以实现快速的自动注入,而无需在xml文档里面添加bean的声明,大大减少了xml文档的维护。(偶喜欢这个功能,因为偶对xml不感冒)。
java web开中spring在autowired自动注入极度精简版本,绝对可以运行。博客地址: http://blog.csdn.net/qq5132834/article/details/47870351
Spring@Autowired注解与自动装配.rar
NULL 博文链接:https://forestqqqq.iteye.com/blog/2235292
spring的annotation的autowired配置方法。
NULL 博文链接:https://huihai.iteye.com/blog/1880106
java 使用Spring2.5的Autowired实现注释型的IOC
通过@Bean 和spring的factoryBean注入的bean. 以及对应@service注解注入的类 通过@Autowired 注入对象的时间是现根据类型在根据beanName获取的案例集合
主要介绍了详解Spring @Autowired 注入小技巧,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要介绍了详解Spring Controller autowired Request变量的相关资料,通过此文希望能帮助到大家,需要的朋友可以参考下
主要介绍了Spring使用@Autowired为抽象父类注入依赖代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
NULL 博文链接:https://cdxs2.iteye.com/blog/1941619
NULL 博文链接:https://moshow.iteye.com/blog/1607718
下面小编就为大家带来一篇基于Spring@Autowired注解与自动装配详谈。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
在阅读本篇之前,如果对后置处理器还不够熟悉的先参考下spring BeanPostProcessor 生命周期 @Autowired使用 构造函数注入 public Class Outer { private Inner inner; @Autowired public Outer(Inner inner) { ...
Spring注解@Resource和@Autowired.doc
Spring @Qualifier utilizando @Autowired
本篇文章主要介绍最重要的三个Spring注解,也就是@Autowired、@Resource和@Service,具有很好的参考价值。下面跟着小编一起来看下吧
学习弹簧自动装配 学习自动装配弹簧