我创建了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)
为什么实体监听器没有在测试环境中调用?
答案 0 :(得分:-1)
以下问题不在测试中,在我的@PrePersist
/ @PreUpdate
侦听器中进行了额外的访问权限检查并抛出了AccessDeniedException
。工作@PrePersist
时 - 一切正常,因为立即触发了这个事件,但是当事务或某些上下文关闭时,@PreUpdate
可以被解雇,当这个检查尝试抛出异常时,它会尝试回滚事务,已经关闭,所以它导致另一个例外。为了应用程序的安全性,没关系 - 更新请求未发送,但不是测试。
此问题的解决方法是将repository.save()
更改为repository.saveAndFlush()
(这会立即导致写入db和@PreUpdate
事件也会被触发)