优秀的编程知识分享平台

网站首页 > 技术文章 正文

单元测试 Mockito(单元测试 mock模拟文件路径)

nanyue 2024-10-17 11:14:40 技术文章 5 ℃

1、需求背景

在开发需求中,发现测试passport新增接口,目前现状下,还是比较麻烦,就了解了一下mockito。整体使用还是比较容易的,下文整理一下玩法,以作后续参考!

下面实例:模拟UserDao的实现impl,当然,举一反三,完全也就可以mock 的dubbo远程实现类了~

2、使用步骤

1、引入依赖:因为spring-boot-starter-test中已经依赖Mockito包了,所以,一般我们无需额外再引其他包

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

2、src/test/java 下编写单元测试

public class User {
    private Integer id;
    private String name; 
    //getter/setter
}

public interface UserDao {  //无实现类,只有接口
    User getUserById(Integer id);
    
    Integer insertUser(User user);
    
    public void print(String name);
}

@Component
public class UserService {
    @Autowired
    private UserDao userDao;

    public User getUserById(Integer id) {
        return userDao.getUserById(id);
    }

    public Integer insertUser(User user) {
        return userDao.insertUser(user);
    }
}

测试:

/**
* Mockito 的限制:
* ======================================
* 不能 mock 静态方法
* 不能 mock private 方法
* 不能 mock final class
*/

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {

    @Autowired
    private UserService userService;

    @MockBean   //模拟, 即使真实不存在!
    private UserDao userDao;

    @Test
    public void getUserById() throws Exception {
        //mock 根据指定参数时,返回值
        //定义当调用mock userDao的getUserById()方法,并且参数为3时,就返回id为200、name为I'm mock3的user对象
        Mockito.when(userDao.getUserById(3)).thenReturn(new User(200, "I'm mock 3"));   
       //任何整数 作为参赛
        Mockito.when(userDao.getUserById(Mockito.anyInt())).thenReturn(new User(200, "I'm mock 3"));  
       //模拟不管传进来的 user 是什麽,都回传 100
        Mockito.when(userService.insertUser(Mockito.any(User.class))).thenReturn(100);  

        //mock抛异常
        Mockito.when(userService.getUserById(9)).thenThrow(new RuntimeException("mock throw exception"));
        //上面是有返回值的mock;这种是方法签名返回void
        Mockito.doThrow(new RuntimeException("mock throw exception2")).when(userDao).print(Mockito.anyString());  

        User user1 = userService.getUserById(3);      //User{id=200, name='I'm mock 3'}
        User user2 = userService.getUserById(1);      //null
        User user3 = userService.getUserById(9);      //会抛出一个RuntimeException

        Integer i = userService.insertUser(new User()); //会返回100

        System.out.println("===============>" + user1);
        System.out.println("===============>" + i);

        userDao.print("xxxx");                      //会抛出一个RuntimeException2

    }
}

3、总结

上例,总结起来,主要下面2步:

1、对于要mock的实例,添加 @MockBean 注解

@MockBean   //需要被模拟的bean
private UserDao userDao;

2、mock使用一般方式

Mockito.when(...).thenReturn(...);

Tags:

最近发表
标签列表