【问题标题】:Grails mockDomain save not savingGrails mockDomain 保存不保存
【发布时间】:2011-08-05 15:21:35
【问题描述】:

我正在为一些简单的方法编写单元测试。我遇到的问题是“保存”不适用于我的域对象,即使应该模拟域。在域对象上调用 validate 时,它​​返回为真。我什至用 try/catch 包围了对象,以确保它没有抛出任何奇怪的错误,但事实并非如此。下面的代码用于调用和测试。

void test()
{
    mockDomain(MyDomain)
    Map map1= ["asdf":" "]
    Map map2 = ["asdf":123]
    InputObject input = new InputObject()
            input.setForeignId("1") //not a constraint
    input.setMap1(map1)
    input.setMap2(map2 )
    service.methodUnderTest(profile)
    List list = MyDomain.getAll()
    assertEquals 1, l.size() //FAILS
}

def persistPublishGuids(InputObject input)
{
    try{
    HashMap map1 = input.map1
    for ( e in map1 )
    {
        String key= e.getKey()
        String value = e.value
        long size = input.map2.get(key)
        MyDomain domain = new MyDomain (id:guid, field1:value, field2:input.foreignId, field3:size)
        domain.save()
    }
    } catch(ex)
    {
        ex.printStackTrace()
    }
}

【问题讨论】:

  • 如果这是sscce 可能会有所帮助。您发布的内容无法自行运行。尝试生成最简单的示例来执行和重现问题并发布。这样做有可能你会发现问题的根源,如果没有,你会有一个更清晰的例子来帮助别人。
  • 我会的,但我想通了。需要运行 grails clean,然后在 STS 中清理/重建项目。我之所以发现这一点,是因为当我今天早上开始编写另一个测试时,它声称我的一个域对象上没有方法“save()”。谷歌搜索让我找到了干净和重建的解决方案。

标签: unit-testing grails mocking


【解决方案1】:

我还建议在测试中保存域对象时将 flush 和 failOnError 标志设置为 true。 'flush:true' 确保立即保存对象。如果没有 failOnError 验证错误,则意味着对象未保存,很容易被遗漏。

domainObject.save(flush:true, failOnError: true)

如果您不想为测试中的所有字段设置基础数据,也值得考虑将验证标志设置为 false

domainObject.save(validate: false)

Grails domain object save docs for full information

【讨论】:

    【解决方案2】:

    问题是需要清理 grails 应用程序并重建项目。

    【讨论】:

    • 这是 grails 的瘟疫......我花更多的时间清理/编译而不是编码......GrrrRails。
    • 我已经很久没有遇到过这个问题了。您一定有设置问题。
    • 我说的是一般性:'clean' grails 有点像 Windows 重新启动...它几乎可以治愈所有奇怪的行为...
    猜你喜欢
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 2013-08-13
    • 1970-01-01
    相关资源
    最近更新 更多