在使用 @Transactional 的 JUnit 测试中不会删除实体

问题描述 投票:0回答:2

我有时在 JUnit 测试中使用 @Transactional 注释。我在 JUnit 中使用 @Transactional 来延迟获取集合。

目前我面临着 @Transactional 注释的未知行为。

在我的数据库中,我有一个 Car 实体。我正在测试中删除这个实体。如果我在测试中使用@Transactional,那么该实体不会从数据库中删除。 否则,如果我不使用@Transactional,则该实体将被删除。 我在数据库中每次测试后都会看到这一点。

我有标准实体和存储库。 我的实体:

@Entity 
public class Car {

    @Id
    @GeneratedValue
    private int id;

    private String model;

    //...constructors, getters and setters }

我的存储库:

public interface CarRepository extends JpaRepository<Car, Integer>{
    List<Car> findByModel(String mazda);
}

我的测试:

@RunWith(SpringRunner.class)
@SpringBootTest
public class RelationsTest {

    @Autowired
    CarRepository carRepository;

    @Test
    //@Transactional
    public void deleteCar() throws Exception {

        List<Car> cars = carRepository.findByModel("Mazda");
        assertThat(cars).hasSize(1);

        carRepository.deleteById(cars.get(0).getId());

    }

使用 @Transactional 实体未从数据库中删除的原因是什么?

java junit transactions spring-data-jpa
2个回答
3
投票

来自 Spring Boot 文档

如果你的测试是@Transactional,它默认会在每个测试方法结束时回滚事务。


0
投票

好吧,但是我在 @Transactional 中删除实体的问题是在测试函数内部,删除也不会发生。对已删除的实体进行查找仍将返回未删除的实体:

e = new Entity(...
repository.save(e);
repository.delete(e);

x = repository.findById(e.getId());

现在 x 保留找到的(未删除的)实体!

因此我通过连接表进行的级联删除(不是此处伪代码的一部分)不会执行。

删除@Transactional,一切都按预期进行。我想让 @Transactional 在测试后重置所有测试实体。

© www.soinside.com 2019 - 2024. All rights reserved.