Unit testing Grails 2.0.3集成测试由于奇怪的原因失败(域模型上的save()不可用于第二次调用setup方法)

Unit testing Grails 2.0.3集成测试由于奇怪的原因失败(域模型上的save()不可用于第二次调用setup方法),unit-testing,grails,groovy,grails-2.0,Unit Testing,Grails,Groovy,Grails 2.0,我最近开始认真地使用Grails2.0,但我遇到了一个对我来说没有多大意义的障碍。我已经编写了一个集成测试,它对控制器使用@TestFor注释,但是我从中得到了非常奇怪的错误。以下是测试,精简到与此问题重复的最小情况: import org.junit.* import grails.test.mixin.TestFor @TestFor(OrderController) class OrderControllerIntegrationTests { public EndUser u

我最近开始认真地使用Grails2.0,但我遇到了一个对我来说没有多大意义的障碍。我已经编写了一个集成测试,它对控制器使用@TestFor注释,但是我从中得到了非常奇怪的错误。以下是测试,精简到与此问题重复的最小情况:

import org.junit.*
import grails.test.mixin.TestFor

@TestFor(OrderController)
class OrderControllerIntegrationTests {

    public EndUser user

    @Before public void initialize() {
        user = new EndUser(username: UUID.randomUUID().toString(), password: "secret");
        user.save()
    }

    @Test public void get() {
        assert true
    }

    @Test public void create() {
        assert true
    }

}
总之,我得到的结果是,对于此类中的第二个测试,测试设置中的save方法不再存在。这看起来…很奇怪

以下是grails测试应用程序exampleapp.OrderControllerIntegrationTests的完整输出:

Testsuite: exampleapp.OrderControllerIntegrationTests
Tests run: 2, Failures: 0, Errors: 1, Time elapsed: 0.769 sec
------------- Standard Output ---------------
--Output from get--
2012-05-15 22:35:03,491 [main] DEBUG transaction.JDBCTransaction  - begin

2012-05-15 22:35:03,493 [main] DEBUG transaction.JDBCTransaction  - current autocommit status: true

2012-05-15 22:35:03,493 [main] DEBUG transaction.JDBCTransaction  - disabling autocommit

2012-05-15 22:35:03,689 [main] DEBUG hibernate.SQL  - insert into widget_user (id, version, password, username, class) values (null, ?, ?, ?, 'exampleapp.EndUser')

2012-05-15 22:35:03,970 [main] DEBUG transaction.JDBCTransaction  - rollback

2012-05-15 22:35:03,970 [main] DEBUG transaction.JDBCTransaction  - re-enabling autocommit

2012-05-15 22:35:03,970 [main] DEBUG transaction.JDBCTransaction  - rolled back JDBC Connection

--Output from create--
2012-05-15 22:35:03,979 [main] DEBUG transaction.JDBCTransaction  - begin

2012-05-15 22:35:03,979 [main] DEBUG transaction.JDBCTransaction  - current autocommit status: true

2012-05-15 22:35:03,979 [main] DEBUG transaction.JDBCTransaction  - disabling autocommit

2012-05-15 22:35:04,207 [main] DEBUG transaction.JDBCTransaction  - rollback

2012-05-15 22:35:04,207 [main] DEBUG transaction.JDBCTransaction  - re-enabling autocommit

2012-05-15 22:35:04,207 [main] DEBUG transaction.JDBCTransaction  - rolled back JDBC Connection

------------- ---------------- ---------------
------------- Standard Error -----------------
--Output from get--
--Output from create--
------------- ---------------- ---------------

Testcase: get took 0.51 sec
Testcase: create took 0.251 sec
    Caused an ERROR
No signature of method: exampleapp.EndUser.save() is applicable for argument types: () values: []
Possible solutions: save(), save(), save(boolean), save(java.util.Map), save(boolean), save(java.util.Map)
groovy.lang.MissingMethodException: No signature of method: exampleapp.EndUser.save() is applicable for argument types: () values: []
Possible solutions: save(), save(), save(boolean), save(java.util.Map), save(boolean), save(java.util.Map)
    at exampleapp.OrderControllerIntegrationTests.initialize(OrderControllerIntegrationTests.groovy:17)
有人有什么想法吗

你没有@mock你的终端用户类,所以我不确定你是如何让它在第一次测试中工作的

我会将注释添加到您的类中,看看是否可以修复它:

@TestFor(OrderController)
@Mock([EndUser])
class OrderControllerIntegrationTests{

@TestFor仅用于单元测试

您可以通过执行以下操作注入控制器

class OrderControllerIntegrationTests extends GroovyTestCase {
    OrderController orderController
    EndUser user

    @Before
    void initialize() {
        user = new EndUser(username: UUID.randomUUID().toString(), password: "secret");
        user.save()
    }
}

嗨,泰德,谢谢你的回复。这是一个集成测试,所以我应该拥有GORM/Hibernate和DB的全部功能,对吗?我的理解是@Mock专门用于域对象的单元测试,而不是集成测试。啊,对不起,完全没有注意到类名中甚至有集成。在Grails2中进行了太多的单元测试:。我将改变我的答案,因为我得到的对您的用例没有意义。事实上,现在我考虑一下,我不认为您应该在集成测试中使用@TestFor注释,这最终会模拟出您不需要模拟的东西,因为这是一个真正的测试。我打赌这就是问题的原因,如果你只是扩展GroovyTestCase,你的问题就会消失。是的,删除@TestFor并扩展GroovyTestCase正是需要发生的事情。也许我只是错过了,但我不记得在grails.org上的任何文档中看到过。哦,好吧。