如何测试我的 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 实现。
我使用 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 实现。