【问题标题】:Mocking domain classes in Grails在 Grails 中模拟域类
【发布时间】:2014-12-02 07:01:31
【问题描述】:

我有一组域和控制器类,分别称为:Organization 和 OrganizationController。

OrganizationController 只有一种方法:

def index() {
    def organizations = Organization.list()
    [orgs: organizations]
}

我尝试通过 2 种方式模拟 Domain 类。

第一种方法是使用@Mock注解,创建对象并保存:

void "test index"() {
    given:
    new Organization(name: 'JIMJIM').save()
    new Organization(name: 'ABC').save()

    def expected = [org: [new Organization(name: 'JIMJIM'),
                    new Organization(name: 'ABC')]]

    when:
    def actual = controller.index()

    then:
    actual == expected
}

这导致 Oraganization.list 返回一个空列表。实际回报 [org: []]

我也尝试过使用 mockDomain:

void "test index"() {
    given:
      mockDomain(Organization, [new Organization(name: 'JIMJIM'),
                              new Organization(name: 'ABC')
     ])

    def expected = [org: [new Organization(name: 'JIMJIM'),
                    new Organization(name: 'ABC')]]

    when:
    def actual = controller.index()

    then:
    actual == expected
}

但是我仍然得到相同的结果。为什么我的域类没有被嘲笑?

我的测试装饰(OrganizationControllerSpec)如下:

@TestFor(OrganizationController)
@Mock(Organization)
@TestMixin(DomainClassUnitTestMixin)
class OrganizationControllerSpec extends Specification {

我正在使用 Grails 2.3.8。

【问题讨论】:

    标签: unit-testing grails mocking grails-orm


    【解决方案1】:

    第一个sn-p好像还可以,但是……

    首先,Organization 对象实际上是创建的吗?是否提供了所有必填字段?请尝试使用save(failOnError: true) 进行确认。

    此外,在控制器中你有orgs,而你在测试中使用org。只是拼写错误吗?

    此外,除非您在 Organization 类中覆盖了 equals 方法,否则数据库中的对象不等于您使用 new 运算符创建的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多