测试驱动开发神器框架Mockito

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

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

  1.模拟依赖maven

  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.POJOthis

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

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

public interface UserDao {
    User insertUser(User user);

    void deleteUser(User user);
}

  4.UserServicecode

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

相关文章
相关标签/搜索