Spring CrudRepository deleteAll()什么都不做

时间:2019-02-26 17:59:43

标签: java spring-boot spring-data-jpa integration-testing

当我尝试通过Spring的CrudRepository从数据库中删除所有记录时,测试一个Controller类,但是似乎什么也没发生。默认情况下,似乎没有刷新。

我从未使用Junit测试在浏览器中的真实控制器调用中尝试过此存储库,但我认为它可以正常工作! :)

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
@ActiveProfiles("test")
@Transactional
public class CostumerControllerIntegrationTest {

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private CostumerService costumerService;

    private Costumer costumer;

    @Before
    public void before() {
        this.costumer = this.exampleBuilder();
        costumerService.saveAll(this.costumer);
    }

    @After
    public void after() {
        costumerService.deleteAll();
    }

    @Test
    public void Should_ReturnStandardError_When_NotFoundById() throws Exception {
        //implementation
    }


private Costumer exampleBuilder() {

    Costumer costumer = new Costumer("Test", "Test", "Test", CostumerType.LEGAL_PERSON);
    State state = new State("Example State");
    City city = new City("Example Sity", state);
    Address address = new Address("Example Address",
            "Example Address", "Example Address",
            "Example Address", city, costumer);

    costumer.getAddresses().add(address);

    return costumer;
}

}

@Service
@Transactional
public class CostumerService {

    @Autowired
    private CostumerRepository repository;

    public void deleteAll() {
        repository.deleteAll();
    }

   //another methods

}

扩展CrudRepository的存储库

@Repository
public interface CostumerRepository extends CrudRepository<Costumer, Integer> {

}

根据@TheCoder注释启用显示sql hibernate.show_sql=true后,结果为:

deleteAll()上的@After

@After
public void after() {
    costumerService.deleteAll();
}

输出sql:

2019-02-27 06:07:06 - HHH000397: Using ASTQueryTranslatorFactory
Hibernate: 
    select
        costumer0_.id as id1_3_,
        costumer0_.cpf_cnpj as cpf_cnpj2_3_,
        costumer0_.email as email3_3_,
        costumer0_.name as name4_3_,
        costumer0_.type as type5_3_ 
    from
        costumers costumer0_

输出sql中deteleAll()上的@AfterTransaction包含删除查询。

@AfterTransaction
    public void afterTransatcion(){
        // List<Costumer> costumers = costumerService.findAll();
        costumerService.deleteAll();
    }


Hibernate: 
    select
        costumer0_.id as id1_3_,
        costumer0_.cpf_cnpj as cpf_cnpj2_3_,
        costumer0_.email as email3_3_,
        costumer0_.name as name4_3_,
        costumer0_.type as type5_3_ 
    from
        costumers costumer0_
Hibernate: 
    delete 
    from
        phones 
    where
        costumer_id=?
Hibernate: 
    delete 
    from
        costumers 
    where
        id=?

2 个答案:

答案 0 :(得分:1)

在我的junit中,在repository.deleteAllInBatch()方法内添加@BeforeEach后对我有用。仅在执行junit时才遇到此问题。

@BeforeEach
public void config()
{
   repository.deleteAllInBatch()
}

答案 1 :(得分:-1)

关闭事务后,将从数据库中删除数据。只能在测试方法的最后进行。

但是,因为您使用的是事务测试,所以所有事务将在测试后自动回滚。

  

默认情况下,测试交易将在测试完成后自动回滚;但是,可以通过@Commit和@Rollback批注声明性地配置事务提交和回滚行为