(一)詳細講解在Spring中進行集成測試

發表于:2009-05-21來源:作者:點擊數: 標簽:講解Springspring
在 單元測試 時,我們盡量在屏蔽模塊間相互干擾的情況下,重點關注模塊內部邏輯的正確性。而 集成測試 則是在將模塊整合在一起后進行的測試,它的目的在于發現一些模塊間整合的問題。有些功能很難通過模擬對象進行模擬,相反它們往往只能在真實模塊整合后,
  在單元測試時,我們盡量在屏蔽模塊間相互干擾的情況下,重點關注模塊內部邏輯的正確性。而集成測試則是在將模塊整合在一起后進行的測試,它的目的在于發現一些模塊間整合的問題。有些功能很難通過模擬對象進行模擬,相反它們往往只能在真實模塊整合后,才能真正運行起來,如事務管理就是其中比較典型的例子。

        按照Spring的推薦(原話:You should not normally use the Spring container for unit tests: simply populate your POJOs in plain JUnit tests!),在單元測試時,你不應該依賴于Spring容器。換言之,你不應該在單元測試時啟動ApplicatonContext并從中獲取Bean,相反你應該通過模擬對象完成單元測試。而集成測試的前提則是事先裝配好模塊和模塊之間的關聯類,如將DAO層真實的UserDao和LoginLogDao裝配到UserServiceImpl再進行測試。具體裝配工作是在Spring配置文件中完成的,因此在一般情況下,集成測試需要啟動Spring容器,你可以在測試類中簡單地從Spring容器中取出目標Bean進行測試。

需要測試的業務接口

        假設我們的應用中擁有一個UserService業務層接口,它擁有4個業務方法,其代碼如下所示:
代碼清單1 UserServie接口

package com.baobaotao.service;
import com.baobaotao.domain.User;
import org.springframework.transaction.annotation.Transactional;
@Transactional
public interface UserService {
boolean hasMatchUser(String userName,String password);
User findUserByUserName(String userName);
void loginSuclearcase/" target="_blank" >ccess(User user);
void registerUser(User user);
}

        我們通過UserServiceImpl對UserService提供了實現: 
        代碼清單2 UserServiceImpl實現UserService接口

package com.baobaotao.service;
import com.baobaotao.dao.LoginLogDao;
import com.baobaotao.dao.UserDao;
import com.baobaotao.domain.LoginLog;
import com.baobaotao.domain.User;
public class UserServiceImpl implements UserService {
private UserDao userDao;
private LoginLogDao loginLogDao;
public boolean hasMatchUser(String userName, String password) {
int matchCount =userDao.getMatchCount(userName, password);
return matchCount > 0;
}
public User findUserByUserName(String userName) {
return userDao.findUserByUserName(userName);
}
public void loginSuccess(User user) {
user.setCredits( 5 + user.getCredits());
LoginLog loginLog = new LoginLog();
loginLog.setUserId(user.getUserId());
loginLog.setIp(user.getLastIp());
loginLog.setLoginDate(user.getLastVisit());
userDao.updateLoginInfo(user);
loginLogDao.insertLoginLog(loginLog);
}
public void setLoginLogDao(LoginLogDao loginLogDao) {
this.loginLogDao = loginLogDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}

        UserServiceImpl引用了兩個DAO層的類(UserDao和LoginLogDao)共同實現UserService的接口,在UserServiceImpl開放使用之前,我們有必須對其進行集成測試,以保證實現邏輯的正確性。


原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97