作為菜鳥的我,以前沒接觸過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