測試驅動開發神器框架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

相關文章
相關標籤/搜索