Spring@Transactional和rollback不工作,Spring集成测试

Spring@Transactional和rollback不工作,Spring集成测试,spring,spring-boot,junit,integration-testing,Spring,Spring Boot,Junit,Integration Testing,我正在spring中进行集成测试,在本例中,我测试了一个服务层 我有一个问题,在服务中的添加测试期间,回滚不起作用,并且总是向基础添加一个项,但不删除它 我将注释@Transactional和@TestPropertySource放在测试类上, 还有application-test.properties,测试成功,但回滚未执行,并且始终向测试数据库添加新项 添加地址的我的测试类和测试方法(最后一个): 当执行addaddress测试时,每次在我的kts_测试数据库(用于测试的db)中添加新项,而

我正在spring中进行集成测试,在本例中,我测试了一个服务层

我有一个问题,在服务中的添加测试期间,回滚不起作用,并且总是向基础添加一个项,但不删除它

我将注释@Transactional和@TestPropertySource放在测试类上, 还有application-test.properties,测试成功,但回滚未执行,并且始终向测试数据库添加新项

添加地址的我的测试类和测试方法(最后一个):

当执行addaddress测试时,每次在我的kts_测试数据库(用于测试的db)中添加新项,而不是回滚

这是一个来自控制台的日志,您可以看到回滚被调用但没有执行,因为当我在测试后刷新数据库时,新项被保留,它没有被删除

INFO 10216 --- [           main] o.s.t.c.transaction.TransactionContext   : Rolled back transaction for test: [DefaultTestContext@3e58a80e testClass = AddressServiceIntegrationTest, testInstance = com.ftn.services.address.AddressServiceIntegrationTest@4678ec43, testMethod = addAddressSuccessTest@AddressServiceIntegrationTest, testException = [null],...
最后,为了说明我尝试了@Transactional-over方法,我还尝试了@Rollback-over方法或@Rollback(true),尝试了更改application-test.properties,但我不再知道错误可能是什么


如果有人能帮忙,我将不胜感激。谢谢。

默认情况下,Hibernate使用MyISAM存储引擎创建表-此引擎不支持事务。您需要有InnoDB表:

  • 要么使用Flyway之类的工具手动管理数据库迁移(imho首选选项,这样您就可以拥有完整的控制权),要么关闭在测试中重新创建数据库
  • 或在配置中设置正确的发动机:
或(已弃用)


你们在MySQL中使用什么存储引擎?当我使用show engines时,InnoDB是默认的。但现在我使用show TABLE STATUS,引擎是MyISAM!但是Hibernate可以根据方言使用不同的引擎创建表。您可以尝试设置:
spring.jpa.properties.hibernate.dialogue=org.hibernate.dialogue.mysql5innodbdialogue
好的,我现在就试试您告诉我的。我将方言添加到prperties文件中,并且再次没有回滚。如果我将数据库、应用程序库和测试库中的引擎都更改为innodb,应用程序是否会出现问题?您有什么想法?如果您关心不同的行为/能力,则会有一些关于这方面的问题得到解答:希望这会有所帮助……)
spring.datasource.url= jdbc:mysql://localhost:3306/kts_test&useSSL=false&
useUnicode=true&characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = root
spring.jpa.show-sql = true
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
INFO 10216 --- [           main] o.s.t.c.transaction.TransactionContext   : Rolled back transaction for test: [DefaultTestContext@3e58a80e testClass = AddressServiceIntegrationTest, testInstance = com.ftn.services.address.AddressServiceIntegrationTest@4678ec43, testMethod = addAddressSuccessTest@AddressServiceIntegrationTest, testException = [null],...
spring.jpa.properties.hibernate.dialect.storage_engine=innodb
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect