編輯2:創建一個集成測試來驗證sessionFactory是否被正確注入。運行以下命令的Grails:
create-integration-test <package>.MyService
您可能已經刪除了單元測試文件MyServiceSpec.groovy
測試/單位目錄,如果它的存在。
實現以下測試:
class MyServiceSpec extends Specification {
def myService
def setup() {
}
def cleanup() {
}
void "test something"() {
when:
def u = myService.serviceMethod()
then:
u != null
}
}
你還需要改變你的服務方法返回用戶實例,以使測試工作,因爲我做了下面。
運行test-app <package.MyService -integration
這是否測試過?如果沒有,請提供有關您的開發環境的更多信息。
編輯:在這種情況下可能無所謂,但是您的grails版本/開發環境是什麼?在提問時指定它會更好。
首先,你爲什麼不使用GORM?我沒有看到使用grails而沒有使用它的核心功能帶來的許多好處。爲什麼你想用sessionFactory
來管理ORM而不是GORM?如果你只是打電話給new UserEntity(email:'grails').save()
,GORM也會這樣做。
這將我引向下一點:您還沒有使用Groovy的功能。在Groovy中,您可以像上面那樣使用映射構造函數,也可以使用像這樣的setter方法:user.email = 'grails'.
此外,調用服務方法後,會話將自動刷新,因此您不需要手動刷新它。但是,這隻適用於服務方法是事務性的 - 並且它們是默認的。
我不想阻止你使用Grails,但恕我直言你沒有利用Groovy和Grails的強大工具,而是編寫Java,Spring和Hibernate。您只能使用慣例,如域類,控制器,視圖和服務,我不知道這是否值得。但這是你的選擇,你的方法令我驚訝,至少可以說。其次,這是您的代碼的工作方式:
MyService。常規:
@Transactional
class MyService {
def sessionFactory
UserEntity serviceMethod() {
def s = sessionFactory.currentSession
def u = new UserEntity(email:'grails')
s.save(u)
//or:
//def user = new UserEntity()
//user.email = 'grails'
//s.save(user)
//or do it the Java way like in your code
u.id ? u : null
}
}
sessionFactory
需要被聲明爲您服務領域,使彈簧能夠在啓動時命名約定注入它。從你的代碼判斷,你應該對spring和依賴注入做進一步的閱讀。 你可以在the official Spring documentation看看,或者做一步一步首先要了解它,在Tutorialspoint .`
感謝您的詳細回答, 其實我使用GWT在我的Grails框架前端 我去通過GORM,但它使用的方式是自動生成視圖常規頁面等,至少在我發現的教程中,我已經有了GWT視圖,我需要從數據庫發送一些數據,所以我現在試着做休眠。 我用上面的ur代碼,但是它說'sessionFactory'爲null。 請指導我爲什麼我的sessionFactory爲空,我是否需要在其他地方定義它,或者我缺少任何東西.. 謝謝 – junaidp
什麼是您的Grails版本?你如何測試你的服務代碼?我將在我的答案中加入樣本集成測試。在單元測試中,bean不是自動裝配的。 – nst1nctz
你能解決這個問題嗎? – nst1nctz