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

时间:2019-07-06 10:51:54

标签: java junit transactions spring-data-jpa

我有时在我的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 将该实体未从数据库中删除的原因是什么?

1 个答案:

答案 0 :(得分:3)

从Spring Boot documentation

  

如果您的测试是@Transactional,则默认情况下它将在每个测试方法的末尾回滚事务。