2013-05-10 81 views
0

我試圖模擬Grails 2.2.1應用中由shiro插件生成的Role類。當我運行單元測試時,我得到這個錯誤,看起來像動態方法沒有添加。Grails領域類未被模擬

這是角色類:

class Role { 
    String name 

    static hasMany = [ users: User, permissions: String ] 

    static belongsTo = User 

    static constraints = { 
     name nullable: false, blank: false, unique: true 
    } 
} 

,這是單元測試:

@TestFor(UserService) 
@TestMixin(DomainClassUnitTestMixin) 
@Mock([User, Role]) 
class UserServiceTests { 
    void testSaveFacebookUser(){ 
     //given 
     def adminRole = new Role(name: RoleEnum.ADMIN.name) 
     adminRole.addToPermissions("*:*") 
     adminRole.save() 
    } 
} 

的堆棧跟蹤:

Running 1 unit test... 1 of 1 
Failure: testSaveFacebookUser(a4o.services.UserServiceTests) 
    groovy.lang.MissingMethodException: No signature of method: a4o.Role.addToPermissions() is applicable 
    for argument types: (java.lang.String) values: [*:*] 

UPDATE

在JIRA上發現了這個,但它說它已關閉2.0.4 http://jira.grails.org/browse/GRAILS-8779。也許它再次打開。

+0

你是單元測試'domain'還是'service'?我認爲如果它是服務,那麼'@ TestFor'就足夠了,你不需要'@ TestMixin'。 – dmahapatro 2013-05-10 17:38:27

回答

0

升級到grails 2.2.2解決了這個問題

0

AFAIK,hasMany聲明應該用於連接給定的類與其他Grails域類,而不是其他對象。如果您需要將權限列表保存爲String對象,則需要創建(並處理!)hasMany塊之外的字符串列表;是這樣的:

class Role { 
    String name 

    List<String> permissions 

    static hasMany = [ users: User ] 

    static belongsTo = User 

    static constraints = { 
     name nullable: false, blank: false, unique: true 
    } 
} 

不管怎麼說,我的建議是不要推倒重來,並使用sprint security plugin(或您選擇的另一個)。

+0

好吧,在我的情況下,shiro安全插件更適合...這是插件生成的Role類。我做了你所建議的修改,但我得到了同樣的錯誤,錯誤表示缺少動態方法 – user2282936 2013-05-10 17:24:49