使用Junit和Mockito对SpringBoot框架项目进行单元测试
看完这篇文章你就可以轻松的完成基本的单元测试,使得覆盖率达到90%以上Mockito 是流行的 Java 单元测试 Mock 框架,免费开源。
Mockito 拥有的非常少的 API,所以开始使用 Mockito,几乎没有时间成本。因为只有一种创造 mock 的方式。只要记住,在执行前 stub,而后在交互中验证。你很快就会发现这样 TDD java 代码是多么自然。
本文会对单元测试中最常见的问题包括:SpringBoot架构下单元测试的基本思路和方法,私有方法的测试、异常测试、测试驱动开发等方面进行阐述
一、mockito单元测试的一般思路
对被测试类的单个方法进行测试,当遇到依赖的外部资源时,对外部资源进行打桩、模拟。从而达到对该方法的逻辑正确性进行测试的目的。例如我们需要测试一个Spring @service A,他可能使用Autowired注解注入了外部的服务B,那么我可以使用Mockito的@Mock注解来对B进行Mock,使用Mockito.when(B.method())方法进行打桩,当测试程序执行到B.method()时就不再进入B中而是返回一个我们预先设定好的值或者行为。
例如:
1、测试类源码如下:
@RunWith(MockitoJUnitRunner.class)
public class TestUserServiceImpl {
@InjectMocks
UserServiceImp userServiceImp;
@Mock
UserMapper mapper;
@Test
public void testGet(){
User user = new User();
user.setName("huaAn");
user.setId(0);
user.setAccount("9527");
Mockito.when(mapper.get(0)).thenReturn(user);
org.junit.Assert.assertTrue(userServiceImp.getUser(0).equals(user));
}
}
2、被测试类
package com.example.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.domain.User;
import com.example.mapper.UserMapper;
@Service
public class UserServiceImp implements UserService {
@Autowired
private UserMapper mapper;
@Override
public List<User> getAll() {
return mapper.list();
}
@Override
public User getUser(Integer id) {
return mapper.get(id);
}
@Override
public void insert(User user) {
mapper.add(user);
}
@Override
public void update(User user) {
mapper.update(user);
}
@Override
public void delete(Integer id) {
mapper.delete(id);
}
}
public interface UserMapper {
public List<User> list();
public User get(Integer id);
public void add(User user);
public void update(User user);
public void delete(Integer id);
}
这就是SpringBoot项目单元测试的一般思路,测试中其他典型的测试方法和场景会在后面不断更新。