spring autowired mockito单元测试

这两天在做spring service层的单元测试时,遇到了一些问题。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));

    }
}


如有问题,请联系wgy@live.cn,感谢!





  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
Spring中进行单元测试时,可以使用JUnit和Mockito等测试框架来编写和执行测试代码。以下是配置Spring单元测试的一般步骤: 1. 在测试类上添加注解 `@RunWith(SpringRunner.class)`,它会告诉JUnit使用Spring提供的测试运行器来运行测试。 例如: ```java @RunWith(SpringRunner.class) public class MyTest { // 测试代码 } ``` 2. 在测试类上使用注解 `@ContextConfiguration` 来指定Spring应用程序上下文的配置。你可以指定一个XML配置文件的路径,或是直接指定一个配置类。 例如,使用XML配置文件: ```java @RunWith(SpringRunner.class) @ContextConfiguration(locations = "classpath:applicationContext.xml") public class MyTest { // 测试代码 } ``` 或者,使用配置类: ```java @RunWith(SpringRunner.class) @ContextConfiguration(classes = MyConfig.class) public class MyTest { // 测试代码 } ``` 3. 使用注解 `@Autowired` 或 `@Resource` 自动注入需要进行测试的bean。 例如: ```java @RunWith(SpringRunner.class) @ContextConfiguration(classes = MyConfig.class) public class MyTest { @Autowired private MyService myService; // 测试代码 } ``` 4. 使用注解 `@Test` 标记测试方法,并在方法内编写测试代码。 例如: ```java @RunWith(SpringRunner.class) @ContextConfiguration(classes = MyConfig.class) public class MyTest { @Autowired private MyService myService; @Test public void testMyService() { // 测试代码 } } ``` 这样配置后,你就可以编写和执行Spring单元测试了。注意,在进行单元测试时,可以使用Mockito等工具来模拟依赖的外部组件。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值