Spring @Transactional和回滚功能不起作用,Spring集成测试

3 浏览
0 Comments

Spring @Transactional和回滚功能不起作用,Spring集成测试

我正在进行Spring的集成测试,在这个例子中我正在测试一个服务层。

我遇到了一个问题,在服务的添加测试中,回滚不起作用,总是向数据库添加一个项目,但不会删除它。

我在测试类上添加了@ Transactional和@ TestPropertySource注释,

还有application-test.properties文件,测试是成功的,但回滚没有执行,而是总是向测试数据库添加一个新项目。

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

@RunWith(SpringRunner.class)

@SpringBootTest(classes = TicketServiceApplication.class)

@Transactional

@TestPropertySource("classpath:application-test.properties")

public class AddressServiceIntegrationTest {

@Autowired

private AddressService addressService;

@Autowired

private AddressRepository addressRepository;

@Test

public void findAllSuccessTest(){

List

result = addressService.finfAllAddress();

assertNotNull(result);

assertFalse(result.isEmpty());

assertEquals(2, result.size());

}

@Test

public void findOneAddressExistTest_thenReturnAddress(){

Long id = AddressConst.VALID_ID_ADDRESS;

Address a = addressService.findOneAddress(id);

assertEquals(id, a.getId());

}

@Test(expected = EntityNotFoundException.class)

public void findOneAddressNotExistTest_thenThrowException(){

Long id = AddressConst.NOT_VALID_ID_ADDRESS;

Address a = addressService.findOneAddress(id);

}

@Test

public void addAddressSuccessTest(){

int sizeBeforeAdd = addressRepository.findAll().size();

Address address = AddressConst.newAddressToAdd();

Address result = addressService.addAddress(address);

int sizeAfterAdd = addressRepository.findAll().size();

assertNotNull(result);

assertEquals(sizeBeforeAdd+1, sizeAfterAdd);

assertEquals(address.getCity(), result.getCity());

assertEquals(address.getState(), result.getState());

assertEquals(address.getNumber(), result.getNumber());

assertEquals(address.getLatitude(), result.getLatitude());

assertEquals(address.getLongitude(), result.getLongitude());

assertEquals(address.getStreet(), result.getStreet());

}

}

我的application-test.properties文件:

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

当执行添加地址测试时,每次都会在我的kts_test数据库中添加一个新项目,并且不会回滚。

这是从控制台的日志中可以看到回滚被调用但未执行的部分,因为在测试后刷新数据库后,新项目仍然存在,而没有被删除。

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,我还尝试了在方法上添加@Rollback或@Rollback(true),尝试了更改application-test.properties文件,但我不知道错误可能是什么。

如果有人能帮助我,我将非常感激。谢谢。

0
0 Comments

问题的原因是Hibernate默认使用MyISAM存储引擎创建表,而MyISAM不支持事务。解决方法有两种:

1. 使用Flyway等工具手动管理数据库迁移,并在测试中关闭重新创建数据库的选项。

2. 在配置中设置正确的引擎:

spring.jpa.properties.hibernate.dialect.storage_engine=innodb

或者(已废弃)

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

如果在应用程序和测试中将引擎都更改为InnoDB,会有什么问题?

你担心的问题是什么?如果你担心不同的行为/功能,有一些关于这个问题的已解答的问题:[stackoverflow.com/questions/12614541/...](https://stackoverflow.com/questions/12614541)希望对你有所帮助。

0