如何在集成测试中使域对象的.save()方法失败?

时间:2011-05-24 15:00:27

标签: testing grails groovy mocking integration-testing

对于集成测试,我希望有意.save()来测试相应的else条件。

我正在测试的课程是这样做的:

来自UserService.groovy:

User user = User.findByXyz(xyz) 
if (user) {
    // foo
    if (user.save()) {
        // bar
    } else {
        // I WANT TO GET HERE
    }
}

到目前为止我尝试过的方法都失败了:

我在UserServiceTests.groovy尝试过的内容:

def uControl    = mockFor(User)
uControl.demand.save { flush -> null }  // in order to test a failing user.save()
def enabledUser = userService.enableUser(u.confirmationToken)
uControl.verify()

// or the following:
User.metaClass.'static'.save = { flush -> null }  // fails *all* other tests too

如何正确地从集成测试中获取else块?

3 个答案:

答案 0 :(得分:3)

在集成测试中,您几乎从不需要模拟或更改元类 - 仅进行单元测试。

如果您希望失败,save()调用只会传入未验证的数据。例如,默认情况下所有字段都不为null,因此使用def user = new User()会失败。

答案 1 :(得分:0)

也许您可以尝试将'validate'更改为其他内容 - 使用您已显示的相同元类编程。 这样,如果验证失败,则保存肯定会失败

答案 2 :(得分:0)

在这种情况下我做了什么: 我总是至少有一个非空的字段。 我只是不设置它然后调用.save() 如果要在数据库中已有的对象上实现此目的,只需使用find或get加载它,并将其中一个非空值设置为null,然后尝试保存它。 如果你没有配置Config.groovy配置为在保存失败时抛出异常将不会抛出异常,它就不会保存它[你可以提前调用.validate()来确定它是否会保存并检查object_instance.errors.allErrors列表以查看错误]。