首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Grails 單元測試實戰:GrailsUnitTestCase 與 ControllerUnitTestCase 深度解析

     編輯:Java 相關知識

Grails 1.1 引入 GrailsUnitTestCase 及其子類,透過內建 Mock 機制,讓單元測試在隔離環境中也能享有 GORM 動態方法、驗證邏輯、日誌注入等完整功能,大幅提升測試速度並減少對資料庫的依賴。本文系統講解核心 Mock 方法、Controller 測試技巧與 REST 服務驗證。

核心測試類別層級

  • GroovyTestCase → 基礎斷言
  • GrailsUnitTestCase → 領域類、Service 測試
  • ControllerUnitTestCase → Controller 測試(繼承前者)

三大核心 Mock 方法

方法用途適用場景
mockForConstraintsTests()注入驗證方法、errors 集合測試 constraints 定義
mockDomain()模擬 GORM 持久化方法測試 save、list、動態查詢
mockLogging()注入 log 實例Service、Controller 使用 log

實戰:驗證約束測試

void testBlank() {
    mockForConstraintsTests(User)
    def user = new User(name: "", login: "admin", password: "wordpass")
    assertFalse user.validate()
    assertEquals 1, user.errors.errorCount
    assertEquals "blank", user.errors["name"]
}

實戰:unique 約束與模擬資料表

void testUniqueLogin() {
    def existing = [new User(login: "jdoe"), new User(login: "suziq")]
    mockForConstraintsTests(User, existing)
    def duplicate = new User(login: "jdoe")
    assertFalse duplicate.validate()
    assertEquals "unique", duplicate.errors["login"]
}

實戰:GORM 方法模擬

void testMockDomain() {
    def users = [new User(name: "John", role: "user"),
                 new User(name: "Jane", role: "admin")]
    mockDomain(User, users)
    assertEquals 1, User.findAllByRole("admin").size()
    def newUser = new User(login: "new", role: "user")
    newUser.save()
    assertEquals 3, User.findAllByRole("user").size() // id 自動分配
}

Controller 測試進階

測試重導向與 Session/Flash

void testIndex() {
    controller.session.user = new User(role: "user")
    controller.index()
    assertEquals "home", controller.redirectArgs.controller
    assertTrue controller.flash.message.startsWith("Sorry")

    controller.session.user = new User(role: "admin")
    controller.index()
    assertEquals controller.list, controller.redirectArgs.action
}

測試參數綁定與模擬資料

void testShow() {
    mockDomain(User, [new User(id: 1, name: "Suzi Q")])
    controller.params.id = 2
    def model = controller.show()
    assertEquals "Suzi Q", model.userInstance.name
}

RESTful 服務測試

void testListXml() {
    mockDomain(User, [new User(login: "suziq", role: "admin")])
    controller.listXml()
    def xml = controller.response.contentAsString
    def root = new XmlParser().parseText(xml)
    assertEquals "suziq", root.user.login.text()
}

執行策略建議

  • grails test-app -unit:僅跑單元測試,秒級反饋
  • grails test-app -unit User:針對單一類測試
  • 集成測試交由 CI 服務器夜ly 跑

局限性提醒

Mock 無法支援:Criteria 查詢、HQL、QBE。涉及此類邏輯請改寫集成測試。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved