在Grails中模拟域类

时间:2014-12-02 07:01:32

标签: unit-testing grails mocking gorm

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

组织控制器只有一个方法:

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

我试图通过两种方式模拟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。

1 个答案:

答案 0 :(得分:1)

第一个片段似乎没问题,但是......

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

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

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