grails域类没有被嘲笑

时间:2013-05-10 15:46:14

标签: unit-testing grails mocking

我正在尝试在Grails 2.2.1应用程序中模拟shiro插件生成的Role类。当我运行单元测试时,我收到的错误似乎没有添加动态方法。

这是Role类:

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()
    }
}

stacktrace:

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: [*:*]

更新

在JIRA上发现了这一点,但它表示已关闭2.0.4 http://jira.grails.org/browse/GRAILS-8779。也许它再次开放。

2 个答案:

答案 0 :(得分: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(或你选择的另一个)。

答案 1 :(得分:0)

升级到grails 2.2.2解决了这个问题