JUnit测试中的JPA存储库+ @EntityListeners

时间:2017-11-23 06:40:38

标签: java hibernate junit spring-data-jpa

我创建了Entity Listerner

public class SomeListener {
    @PrePersist
    @PreUpdate
    public void someAction(final SomeInterface entity) {

并将其添加到Entitites

@Entity
@EntityListeners(SomeListener.class)
public class SomeEntity implements SomeInterface {

从存储库

获取的实体
@Repository
public interface SomeRepository
        extends JpaRepository<SomeEntity, Long>, JpaSpecificationExecutor<SomeEntity> {

在代码中它工作正常,但在测试中忽略了这个监听器

测试配置:

@SpringBootApplication(scanBasePackages = {
        "package with listener",
        "package with model",
        "package with repository",
        "and all other packages"
})
@EnableJpaRepositories(basePackages = {
        "packages with repositories"
})
@EntityScan(basePackages = {
        "packages with models"
})
public class TestConfig {
}

集成测试的抽象类:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = TestConfig.class)
@AutoConfigureMockMvc
@Transactional
public abstract class AbstractTestInt {

在测试中刚刚调用

mockMvc.perform(post(CREATE_URL).params(someparams))
.andExpect(status().is5xxServerError())

实体监听器应检查一些属性并抛出异常,因为提供了params错误,但异常没有被抛出,在调试器中我可以看到参数确实错误,所以返回状态redirection,因为成功保存时叫someRepository.save(entity)

为什么实体监听器没有在测试环境中调用?

1 个答案:

答案 0 :(得分:-1)

以下问题不在测试中,在我的@PrePersist / @PreUpdate侦听器中进行了额外的访问权限检查并抛出了AccessDeniedException。工作@PrePersist时 - 一切正常,因为立即触发了这个事件,但是当事务或某些上下文关闭时,@PreUpdate可以被解雇,当这个检查尝试抛出异常时,它会尝试回滚事务,已经关闭,所以它导致另一个例外。为了应用程序的安全性,没关系 - 更新请求未发送,但不是测试。

此问题的解决方法是将repository.save()更改为repository.saveAndFlush()(这会立即导致写入db和@PreUpdate事件也会被触发)