程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 使用Spring 2.5 TestContext 測試框架

使用Spring 2.5 TestContext 測試框架

編輯:關於JAVA

Spring 2.5 TestContext 測試框架用於測試基於 Spring 的程序,TestContext 測試框架和低版本 Spring 測試框架沒有任何關系,是一個全新的基於注解的測試框架,為 Spring 推薦使用該測試框架。

概述

Spring 2.5 相比於 Spring 2.0 所新增的最重要的功能可以歸結為以下 3 點:

基於注解的 IoC 功能;

基於注解驅動的 Spring MVC 功能;

基於注解的 TestContext 測試框架。

Spring 推薦開發者使用新的基於注解的 TestContext 測試框架,本文我們將對此進行詳細的講述。

低版本的 Spring 所提供的 Spring 測試框架構在 JUnit 3.8 基礎上擴展而來,它提供了若干個測試基類。而 Spring 2.5 所新增的基於注解的 TestContext 測試框架和低版本的測試框架沒有任何關系。它采用全新的注解技術可以讓 POJO 成為 Spring 的測試用例,除了擁有舊測試框架所有功能外,TestContext 還添加了一些新的功能,TestContext 可以運行在 JUnit 3.8、JUnit 4.4、TestNG 等測試框架下。

直接使用JUnit 測試Spring 程序存在的不足

在拙作《精通 Spring 2.x — 企業應用開發詳解》一書中,筆者曾經指出如果直接使用 JUnit 測試基於 Spring 的程序,將存在以下 4 點明顯的不足:

導致 Spring 容器多次初始化問題:根據 JUnit 測試用例的調用流程,每執行一個測試方法都會重新創建一個測試用例實例並調用其 setUp() 方法。由於在一般情況下,我們都在 setUp() 方法中初始化 Spring 容器,這意味著測試用例中有多少個測試方法,Spring 容器就會被重復初始化多少次。

需要使用硬編碼方式手工獲取 Bean:在測試用例中,我們需要通過 ApplicationContext.getBean() 的方法從 Spirng 容器中獲取需要測試的目標 Bean,並且還要進行造型操作。

數據庫現場容易遭受破壞:測試方法可能會對數據庫記錄進行更改操作,破壞數據庫現場。雖然是針對開發數據庫進行測試工作的,但如果數據操作的影響是持久的,將會形成積累效應並影響到測試用例的再次執行。舉個例子,假設在某個測試方法中往數據庫插入一條 ID 為 1 的 t_user 記錄,第一次運行不會有問題,第二次運行時,就會因為主鍵沖突而導致測試用例執行失敗。所以測試用例應該既能夠完成測試固件業務功能正確性的檢查,又能夠容易地在測試完成後恢復現場,做到踏雪無跡、雁過無痕。

不容易在同一事務下訪問數據庫以檢驗業務操作的正確性:當測試固件操作數據庫時,為了檢測數據操作的正確性,需要通過一種方便途徑在測試方法相同的事務環境下訪問數據庫,以檢查測試固件數據操作的執行效果。如果直接使用 JUnit 進行測試,我們很難完成這項操作。

Spring 測試框架是專門為測試基於 Spring 框架應用程序而設計的,它能夠讓測試用例非常方便地和 Spring 框架結合起來,以上所有問題都將迎刃而解。

一個需要測試的 Spring 服務類

在具體使用 TextContext 測試框架之前,我們先來認識一下需要測試的 UserService 服務類。UserService 服務類中擁有一個處理用戶登錄的服務方法,其代碼如下所示:

清單1. UserService.Java 需要測試的服務類

package com.baobaotao.service;

import com.baobaotao.domain.LoginLog;

import com.baobaotao.domain.User;

import com.baobaotao.dao.UserDao;

import com.baobaotao.dao.LoginLogDao;

public class UserService{

private UserDao userDao;

private LoginLogDao loginLogDao;

public void handleUserLogin(User user) {

user.setCredits( 5 + user.getCredits());

LoginLog loginLog = new LoginLog();

loginLog.setUserId(user.getUserId());

loginLog.setIp(user.getLastIp());

loginLog.setLoginTime(user.getLastVisit());

userDao.updateLoginInfo(user);

loginLogDao.insertLoginLog(loginLog);

}

//省略get/setter方法

}

UserService 需要調用 DAO 層的 UserDao 和 LoginLogDao 以及 User 和 LoginLog 這兩個 PO 完成業務邏輯,User 和 LoginLog分別對應 t_user 和 t_login_log 這兩張數據庫表。

在用戶登錄成功後調用 UserService 中的 handleUserLogin() 方法執行用戶登錄成功後的業務邏輯:

登錄用戶添加 5 個積分(t_user.credits);

登錄用戶的最後訪問時間(t_user.last_visit)和 IP(t_user.last_ip)更新為當前值;

在日志表中(t_login_log)中為用戶添加一條登錄日志。

這是一個需要訪問數據庫並存在數據更改操作的業務方法,它工作在事務環境下。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved