Spring CrudRepository deleteAll() 什么都不做

Pab*_*uza 7 java integration-testing spring-data-jpa spring-boot

当我尝试通过 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;
}
Run Code Online (Sandbox Code Playgroud)

}

@Service
@Transactional
public class CostumerService {

    @Autowired
    private CostumerRepository repository;

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

   //another methods

}
Run Code Online (Sandbox Code Playgroud)

扩展 CrudRepository 的存储库

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

}
Run Code Online (Sandbox Code Playgroud)

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

deleteAll()@After

@After
public void after() {
    costumerService.deleteAll();
}
Run Code Online (Sandbox Code Playgroud)

输出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_
Run Code Online (Sandbox Code Playgroud)

deteleAll()@AfterTransaction输出SQL包括删除查询。

@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=?
Run Code Online (Sandbox Code Playgroud)

Sel*_*dek 0

当事务关闭时,数据将从数据库中删除。这应该只发生在测试方法的最后。

但是,由于您正在使用事务测试,因此所有事务都将在测试后自动回滚。

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