如何测试我的 Grails 服务保存方法?

How can I test my Grails service save method?

我使用 grails create-service TaskCRUDService 创建了 Grails 服务。该命令在 grails-app\services 中创建了文件 TaskCRUDService.groovy,在 test\unit 文件夹中创建了 TaskCRUDServiceSpec.groovy

我的TaskCRUDService中唯一的方法是

Task save(String name) {
    Task task = new Task()
    task.name = name

    task.save(flush: true, failOnError: true)
}

我想测试这个方法,所以我在测试 class 中填充了由 Grails 生成的 "test something" 方法的主体。所以这是我的 TaskCRUDServiceSpec 代码:

@TestFor(TaskCRUDService)
class TaskCRUDServiceSpec extends Specification {

    void "test something"() {
        when:
            Task t = service.save('task name')
        then:
            assert t.name == 'task name'
    }
}

但是测试不行。当我 运行 grails test-app 我得到

java.lang.IllegalStateException: Method on class [Task] was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly.
        at TaskCRUDService.$tt__save(TaskCRUDService.groovy:29)
        at TaskCRUDServiceSpec.test create(TaskCRUDServiceSpec.groovy:24)

这看起来应该可行,但即使可行,这也是一个糟糕的测试。永远不要使用单元测试来测试持久性。使用集成测试,这样您就可以使用真实的数据库,而不仅仅是使用 ConcurrentHashMap 存储数据的内存中 GORM 实现。