在一个grails项目(2.3.7版)中,我使用Spock进行了一个集成测试:
class SimpleIntegrationTests extends IntegrationSpec{
void "test an action from controller to database"(){...}
}
这个集成测试使用Spring batch启动一个批处理。Spring批处理不接受从现有事务启动的批处理:
java.lang.IllegalStateException: Existing transaction detected in JobRepository. Please fix this and try again
所以我告诉我的集成测试运行没有事务,与:
static transactional = false
这样做,测试运行成功。
但是在我的项目中还有其他集成测试,它们需要事务才能正确运行。并且我的测试类中的指令"transactionnal = false"并不局限于这个测试类,而是影响在我的测试类之后触发的所有其他集成测试。
我知道测试是按字母顺序执行的。所以我知道,如果我将测试类重命名为最后一个要运行的测试类,它就会正常工作,并且我的所有测试都是成功的。但我认为这不是解决问题的理想办法。
所以我的问题是:如何定义一个测试类是非事务性的,以一种不影响其他集成测试的方式?
我知道这是一个老问题,我想你已经找到了一个解决方案,但是作为一个工作,我认为你需要明确地指定static transactional = true
在集成测试中,你仍然希望是事务性的。我们在Grails 2.3.7测试套件中也遇到过类似的问题…