3

我似乎无法弄清楚如何在服务单元测试中设置模拟服务的属性。我尝试过使用需求对象和setProperty似乎从 Grails 2 中消失的方法。

@TestFor(SomeService)
@Mock([HelperService])
class SomeServiceTests {

void testDoSomething() {
    def helperService = mockFor HelperService

    // tried this, error in method being tested
    helperService.setProperty('propToSet',['a','b'])
    // tried this, error in test
    helperService.demand.propToSet = ['a','b']
    // tried this, error in method being tested
    helperService.demand.getPropToSet() {['a','b']}

    service.helperService = helperService

    assert service.doSomething('aa') != null
}
}

对于其中的大多数,错误是No such property: propToSet for class: grails.test.GrailsMock从我正在测试的需要它的方法中抛出的。上面的第二个选项实际上给出了一个硬错误。如何在模拟的 Grails 对象中设置属性?

4

1 回答 1

0

我对 Grails 模拟工具的体验也不是很好。所以我一直在使用 GMock 并对它感到满意。GMock 与所有 Grails 测试配合良好,包括控制器、服务和域类以及 Spock 的规范。

要使用它,只需将以下行放入 grails-app/conf/BuildConfig.groovy:

dependencies {
    test 'org.gmock:gmock:0.8.2'
}

这是您的代码的 GMock 版本。

@WithGMock
@TestFor(SomeService)
class SomeServiceTests {

    void testDoSomething() {
        def helperService = mock(HelperService)
        helperService.propToSet.returns(['a', 'b'])    
        service.helperService = helperService
        play {
            assert service.doSomething('aa') != null
        }
    }

}

请注意,您的模拟代码只会在play { }块中产生影响。所以我们需要这个块来包裹断言语句。

于 2012-07-29T07:28:48.150 回答