gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:48:01 24 4
gpt4 key购买 nike

我已经创建了实体监听器

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())

实体监听器应该检查一些属性并抛出异常,因为提供的参数错误,但没有抛出异常并且在调试器中我可以看到参数确实错误,所以返回状态重定向,作为成功保存当调用 someRepository.save(entity)

为什么在测试上下文中不调用 Entity Listener?

最佳答案

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

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

关于java - JPA 存储库 + JUnit 测试中的 @EntityListeners,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47449105/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com