测试驱动开发神器框架Mockito

  作为菜鸟的我,以前没接触过Mock类型的框架,比如说要测试action层,我总是从action层调用service再调用dao访问数据库,这种方式从原则上来说是无疑是非常正确的,在没用mock框架之前我就隐隐约约的感觉到了这种方式有个不足的地方,那就是速度问题,测试action层的时候需要访问下面两层,如果我们下面两层已经经过单元测试证明是ok的,那么如果测试action层的时候再调用下面两层就等于是做了重复的动作,逻辑上没问题,只是有点重复,并且速度很慢,毕竟项目做到靠后期的时候文单元测试非常多,maven在自动测试的时候速度会非常慢。

  而mock框架原理就是模拟对象,方法调用,异常抛出等动作,文档上面介绍他主要解决的问题是项目中有时候依赖不存在的情况下来模拟一来,然而我却是因为速度问题用这个框架,造成这个现象的原因是因为我的项目原因,因为项目不大,逻辑不是很复杂,我在开发的时候往往能从dao、service到action一气呵成来做,不存在模拟依赖的问题,而只是想要解决测试的时候性能问题。当然我的情况是个例,不过我认为mock框架的作用就是这两个:

  1.模拟依赖

  2.解决单元测试的重复测试来提升性能。

  Mockito的使用:我们以User类来测试。

  1.把包加入到project中来:此处版本为1.9.5。

        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-all</artifactId>
            <version>1.9.5</version>
            <scope>test</scope>
        </dependency>

  2.POJO

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

  3.UserDao,此处的接口是没有实现的,我们就是为了能模拟接口的实现,感觉上就像Spring为此接口注入了实现一样

public interface UserDao {
    User insertUser(User user);

    void deleteUser(User user);
}

  4.UserService

public interface UserService {
    User insertUser(User user);

    void deleteUser(User user);
}

  5.UserServiceImpl

public class UserServiceImpl implements UserService {
    
    private UserDao userDao;
    
    public UserServiceImpl() {}
    
    public UserServiceImpl(UserDao userDao) {
        this.userDao = userDao;
    }
    
    public User insertUser(User user) {
        return userDao.insertUser(user);
    }

    public void deleteUser(User user) {
        userDao.deleteUser(user);
    }
    
}

  6.测试

public class UserServiceTest {

    private UserService userService;

    @Test
    public void insertUserTest() {

        // pojo对象
        User user = new User();
        user.setId("123");
        user.setName("Jay");
        user.setAge(100);

        // mock一个userDao对象,本来是不存在的
        UserDao userDao = Mockito.mock(UserDao.class);
        Mockito.when(userDao.insertUser(user)).thenReturn(user);
        User u = userDao.insertUser(user);

        // 这里模拟Spring给userService注入userDao
        userService = new UserServiceImpl(userDao);
        User us = userService.insertUser(user);

        Assert.assertEquals(us, user);// 测试结果ok
        
        // 在开发中有接口UserDao但是没有实现,因此UserService里面的userDao属性也是没有实现的,
        // 模拟Spring给UserService里面的userDao注入一个实现,实际上没有注入,而仅仅是mock了一个userDao
        // 在userService调用insertUser(User user)方法的时候就能模拟实现
        // 当然这里仅仅mock了方法调用返回,还有mock异常,验证调用次数等
    // 从整个来讲,这个框架是十分简单易用功能强大的,这里的简单是指使用简单,框架本身是相当复杂的
} }

参考地址:http://zhongl.iteye.com/blog/296136

原文地址:https://www.cnblogs.com/dreamroute/p/3916403.html