2013-05-10 82 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