gpt4 book ai didi

mysql - 使用 MySQL 8 的事务性 Spring Boot 测试回滚事务,但无论如何都会插入行

转载 作者:行者123 更新时间:2023-11-29 07:17:52 25 4
gpt4 key购买 nike

通常当我用 Spring Data JPA 做一个 Spring Boot 应用程序时,在测试中事务自动回滚并且测试数据库没有改变。但是,此行为不适用于 MySQL8。

我有一个名为 Category 的普通 POJO。

@Entity
@Table(name = "categories")
public class Category {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "category_id")
private Integer id;

@Column(name = "category_name")
private String name;

// ... constructors, getters and setters, etc, omitted ...
}

这是我更简单的存储库界面:

public interface CategoryRepository extends JpaRepository<Category,Integer> {
}

我有一个现有的数据库,这里是我的 application.properties 设置来访问它:

spring.datasource.url=jdbc:mysql://localhost:3306/dashboard
spring.datasource.username=admin
spring.datasource.password=not_password
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

表格中目前有 10 个类别。我的测试检查它们,另一个测试插入一个新的。

@DataJpaTest
@AutoConfigureTestDatabase(replace= AutoConfigureTestDatabase.Replace.NONE)
class CategoryRepositoryTest {
@Autowired
private CategoryRepository dao;

@Test
void findAll() {
List<Category> categories = dao.findAll();
assertEquals(10, categories.size());
}

@Test
void insertCategory() {
Category cat = new Category("Misc");
assertNull(cat.getId());
cat = dao.save(cat);
assertNotNull(cat.getId());
System.out.println(cat);
}
}

注意 @DataJpaTest 已经包含了 @Transactional。第二个测试的输出是:

2019-10-03 14:26:48.844  INFO 91485 --- [    Test worker] o.s.t.c.transaction.TransactionContext   : Began transaction (1) for test context [DefaultTestContext@67e4b73d testClass = CategoryRepositoryTest, testInstance = com.kousenit.simpledemo.dao.CategoryRepositoryTest@3913544f, testMethod = insertCategory@CategoryRepositoryTest, testException = [null], mergedContextConfiguration = [MergedContextConfiguration@7314dd45 testClass = CategoryRepositoryTest, locations = '{}', classes = '{class com.kousenit.simpledemo.MyApplication}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@3c6df497, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@351584c0, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@8b9f8fd, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@15acb0c6, [ImportsContextCustomizer@76c5962 key = [org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration, org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration, org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration, org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration, org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManagerAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@21f27cf2, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@67568498, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0], contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map[[empty]]]; transaction manager [org.springframework.orm.jpa.JpaTransactionManager@4a3861f3]; rollback [true]
Hibernate:
insert
into
categories
(category_name)
values
(?)
Category{id=11, name='Misc'}
2019-10-03 14:26:48.880 INFO 91485 --- [ Test worker] o.s.t.c.transaction.TransactionContext : Rolled back transaction for test: [DefaultTestContext@67e4b73d testClass = CategoryRepositoryTest, testInstance = com.kousenit.simpledemo.dao.CategoryRepositoryTest@3913544f, testMethod = insertCategory@CategoryRepositoryTest, ...

问题是,测试结束后,我的数据库中仍然有新类别。使用 H2,事务回滚并且它不存在,但是对于 MySQL 8,即使发生回滚,插入的项目仍然存在。

这里有什么不同?我该如何修复它以便在测试结束时重置插入件?

最佳答案

因为事务需要显式提交。因此我认为您需要将自动提交的属性设置为 false。像这样

<property name="hibernate.connection.autocommit">false</property>

关于mysql - 使用 MySQL 8 的事务性 Spring Boot 测试回滚事务,但无论如何都会插入行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58225093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com