首页 > 解决方案 > 如何在 Grails 单元测试类中动态模拟域?

问题描述

在 Grails 3.x 中编写单元测试时,我们必须模拟域。这是示例代码。

package com.example.service
import grails.test.mixin.Mock
import grails.test.mixin.TestFor
import spock.lang.Ignore
import spock.lang.Specification

@TestFor(SomeService)
@Mock([DomainA, DomainB])
class SomeServiceSpec extends Specification{
   ...
}

问题是当添加一个新域时,比如说 DomainC 并且单元测试依赖于 DomainC,那么这些单元测试就会失败。然后我们必须手动添加 DomainC。

有没有办法动态模拟域?

@TestFor(SomeService)
@Mock([dynamically mock all domain objects here])
class SomeServiceSpec extends Specification{
   ...
}

标签: unit-testinggrails

解决方案


也许这就是您所需要的(来自grails doc)。

或者,您也可以直接将 DomainClassUnitTestMixin 与 TestMixin 注释一起使用,然后在测试期间调用 mockDomain 方法来模拟域:

@TestFor(BookController)
@TestMixin(DomainClassUnitTestMixin)
class BookControllerSpec extends Specification {

    void setupSpec() {
         mockDomain(Book)
    }
...

域列表也mockDomains存在方法,您可以通过标准方式从上下文中检索。


推荐阅读