【问题标题】:grails domain class not mockedgrails域类没有被嘲笑
【发布时间】:2013-05-10 15:46:14
【问题描述】:

我正在尝试在 Grails 2.2.1 应用程序中模拟由 shiro 插件生成的 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()
    }
}

堆栈跟踪:

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 关闭。也许它又开了。

【问题讨论】:

  • 您是在对domain 还是service 进行单元测试?我认为如果是服务,那么@TestFor就足够了,你不需要@TestMixin

标签: unit-testing grails mocking


【解决方案1】:

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(或您选择的另一个)。

【讨论】:

  • 好吧,在我的情况下,shiro 安全插件更适合......这是插件生成的 Role 类。我做了你建议的修改,但我得到了同样的错误,错误说动态方法丢失了
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 2020-07-21
    • 2020-04-23
    • 2015-06-06
    相关资源
    最近更新 更多