2012-04-23 83 views
7

我有一個域類,它擴展了一個抽象類,它注入了spring security core plugin服務。如何模擬從Controller測試類中注入到域類中的服務?

class Extra extends WithOwner { 
    String name 
} 

abstract class WithOwner { 
    transient springSecurityService 
    User user 

    def getCurrentUser() { 
     return springSecurityService.currentUser 
    } 

    def beforeValidate() { 
     if(!user) { 
      user = getCurrentUser() 
     } 
    } 

    Boolean isLoggedUserTheOwner(){ 
     return (user?.id == getCurrentUser()?.id) 
    } 
} 

我想實施控制器測試。

@TestFor(ExtraController) 
@Mock([Extra, User, UserRole, Role]) 
class ExtraControllerTests { 

    void testEdit() { 
     def utils = new TestUtils() 
     def user1 = utils.saveUser1() 

     populateValidParams(params) 
     def extra = new Extra(params) 
     extra.user = user1 
     assert extra.save() != null 

     params.id = extra.id 


     def model = controller.edit() // Line 69 
     assert model.extraInstance == extra 
    } 
} 

如果我運行上面的測試中,我得到:

測試應用ExtraController.testEdit --unit --echoOut |運行1個單元測試... 1 of 1 - 從testEdit輸出 - |失敗:testEdit(com.softamo.movi​​lrural.ExtraControllerTests) | java.lang.NullPointerException:在com.softamo.movi​​lrural.WithOwner.getCurrentUser(WithOwner.groovy:8)上的空對象 上無法獲取屬性'currentUser'。com.softamo.movi​​lrural.WithOwner.isLoggedUserTheOwner(WithOwner.groovy:18)上的 ) at com.softamo.movi​​lrural.ExtraController.edit(ExtraController.groovy:39) at com.softamo.movi​​lrural.ExtraControllerTests.testEdit(ExtraControllerTests.groovy:69) |完成1個單元測試,1未能在853ms

我曾嘗試沒有成功嘲笑這樣的安全服務:

Extra.metaClass.springSecurityService = new MockSpringSecurityService(user1) 

甚至嘲諷的方法

Extra.metaClass.getCurrentUser = { return user1 } 

任何想法,我怎麼可能解決這個問題。

+0

您好!我陷入了同樣的問題。你有沒有爲你的問題找出解決方案?或者,也許你有一個側面注入一個域對象內的服務沒有單元測試自動裝配? – snowindy 2012-11-18 19:47:53

+0

這個問題有什麼好運?,面臨同樣的問題。 – 2015-11-01 06:27:29

回答

1

這應該工作:

controller.springSecurityService = new SpringSecurityService() 

如果你想嘲笑這個服務getCurrentUser方法:

controller.springSecurityService.metaClass.getCurrentUser = { -> return user1 } 

我不知道,如果你能在上面一行ommit ->,因此測試它。如果你想使用接連測試用例或之前清除這個模擬的方法使用:

controller.springSecutiryService.metaClass = null 
+1

這解釋瞭如何將服務注入控制器,他的問題是如何模擬域對象中的服務。 – 2012-04-23 09:26:00

+0

只是爲了記錄,你可以省略' - >'並簡化爲'getCurrentUser = {user1}' – 2013-08-08 16:13:33

2

Grails的2.x支持定義使用「defineBeans」封閉測試環境的Spring bean。 它支持在控制器等依賴注入,我不知道它是否也適用於域對象。理論上,它應該在域對象/控制器/服務中保持一致

請參閱http://grails.org/doc/latest/guide/single.html#testing - 「測試Spring Beans」部分。

+0

我試過這個但是不起作用。不知道如何爲域類設置它。defineBeans {0} {0} springSecurityService(new MockSpringSecurityService(user1)) – 2012-04-23 11:22:47

+0

當您定義Spring bean時,您不需要執行新的MockSpringSecurityService(),只需springSecurityService(MockSpringSecurityService) – 2012-04-23 13:23:34

相關問題