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
相关推荐
本篇文章将深入探讨如何在Spring项目中集成TestNG和Mockito进行单元测试。 TestNG是一个强大的测试框架,它扩展了JUnit的功能,提供了更灵活的测试配置,如并发测试、更丰富的注解、更详尽的测试报告等。首先,你...
在Spring MVC框架中,单元测试是确保代码质量的重要步骤,特别是在控制器层(Controller)。这篇博客主要探讨了如何使用JUnit进行Spring MVC Controller的单元测试。在实际开发中,单元测试可以帮助我们尽早发现潜在...
Spring MVC 是一个强大的Java web开发框架,用于构建可维护、可扩展的...总之,通过正确使用JUnit、Mockito、Spring Test以及MockMVC,我们可以编写出全面、有效的Spring MVC单元测试,确保代码质量并降低潜在的bug。
在Spring Boot框架中,单元测试是一项至关重要的任务,它能够帮助开发者确保代码的正确性和可靠性。Spring Boot提供了方便的工具和库,使得编写和执行单元测试变得简单高效。本章节我们将深入探讨Spring Boot中的...
在Spring框架中,单元测试和...通过上述内容,我们可以了解到Spring3中如何进行单元测试和集成测试,以及如何结合Mockito等工具来编写更高效的测试。理解并熟练运用这些测试技术,将有助于提高代码质量,降低维护成本。
在Spring Boot中,单元测试是确保代码质量和可维护性的重要组成部分。通过单元测试,开发者能够独立验证代码的各个部分,确保它们按照预期工作,并在修改代码后快速发现潜在问题。Spring Boot为此提供了一系列便利...
在Spring Boot框架中,单元测试是一项至关重要的任务,它能够帮助开发者确保代码的质量,提前发现潜在问题,并且便于持续集成和重构。本篇内容将基于"27. Spring Boot Junit单元测试【从零开始学Spring Boot】"的...
总结起来,通过Java配置的Spring Web项目,我们可以利用JUnit、Mockito以及H2数据库轻松地进行单元测试。对于Controller层,我们使用`@WebMvcTest`注解;对于Service层,我们结合`@MockBean`和`@Autowired`创建mock...
本文将深入探讨如何在IDEA中对Spring多模块项目中的Service层进行单元测试。 首先,我们需要理解Spring Boot的多模块架构。一个标准的Spring Boot多模块项目通常包括以下部分:父模块(parent)、应用主模块...
其中,Spring对于业务层的单元测试和集成测试提供了丰富的工具和功能,使得开发者能够更加高效地对代码进行验证和调试。本文将深入探讨Spring如何帮助我们进行业务层的测试。 首先,单元测试主要关注的是单个类或...
本案例涵盖了Spring和Struts两大框架的单元测试,旨在帮助开发者掌握如何对这两个流行的Java Web框架进行有效的测试。 一、Junit基础 1. Junit简介:Junit是一款开源的、基于Java的测试框架,由Ernst Leifer和Kent...
除了基本的单元测试,我们还可以结合Mockito、PowerMock等库进行更高级的测试,如模拟静态方法、私有方法或final类。这些工具可以帮助我们处理那些难以直接测试的代码。 总之,Spring整合JUnit进行单元测试是一个...
Mockito是一个流行的Java单元测试框架,用于创建和管理模拟对象(mock objects)。在集成测试中,我们可能不希望依赖于真实的数据库或外部服务,这时Mockito可以帮助我们模拟这些依赖,以便专注于测试目标代码的行为...
在Spring Boot中进行单元测试通常依赖于一系列的测试框架和工具,包括但不限于JUnit、Spring Test、Mockito等。 - **JUnit**:是Java中最常用的单元测试框架之一,提供了强大的断言机制和灵活的测试组织方式。 - **...
在Spring Boot项目中使用Mockito是非常有用的,它可以帮助我们更好地进行单元测试和集成测试。在本文中,我们将通过示例代码来介绍如何在Spring Boot项目中使用Mockito, 以及它的优点和注意事项。 什么是Mockito?...
本示例“spring-demo15-测试”主要聚焦于Spring框架中的测试部分,通过一系列的实例,深入探讨如何有效地进行Spring应用的单元测试和集成测试。 1. **Spring测试模块** Spring框架提供了内置的测试支持,包括`...
在Spring中,我们可以使用JUnit和Mockito等工具进行单元测试。针对iBatis的测试,通常会涉及到以下几个步骤: 1. 配置测试环境:创建一个专门为测试用的配置文件,如`test-context.xml`,在这个配置文件中,我们...