当前位置: 首页 > 知识库问答 >
问题:

在单元测试中未调用Hibernate的PreUpdateEventListener

郎曾笑
2023-03-14

我正在尝试测试我的PreUpdateEventListener流,但我似乎无法使其在JUnit测试中工作。我没有收到任何错误,但没有调用代码。

我的PreUpdateEventListener:

@Component
public class CandidateListener implements PreUpdateEventListener {

@Autowired
EntityManagerFactory entityManagerFactory;

@PostConstruct
private void init() {
    HibernateEntityManagerFactory hibernateEntityManagerFactory = (HibernateEntityManagerFactory) this.entityManagerFactory;
    SessionFactoryImpl sessionFactoryImpl = (SessionFactoryImpl) hibernateEntityManagerFactory.getSessionFactory();
    EventListenerRegistry registry = sessionFactoryImpl.getServiceRegistry().getService(EventListenerRegistry.class);
    registry.appendListeners(EventType.POST_LOAD, this);
    registry.appendListeners(EventType.PRE_UPDATE, this);
}

@Override
public boolean onPreUpdate(PreUpdateEvent event) {
    final Object entity = event.getEntity();
    if (entity == null) return false;

    // code here not being called in unit tests, but works fine on server

    return false;
}

}

测试:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@IntegrationTest
@Transactional
public class CandidateListenerTest {

@Autowired
CandidateRepository candidateRepository;

@Autowired
EntityAuditEventRepository entityAuditEventRepository;

@Autowired
SessionFactory sessionFactory;

@Test
public void testHistoryLogging() {
    Candidate cand = new Candidate();
    cand.setEmail("123@gmail.com");
    cand.setFirstName("12");
    cand.setLastName("3");

    cand = candidateRepository.save(cand);

    cand.setLastName("34");
    candidateRepository.save(cand);

    assertEquals(entityAuditEventRepository.findAll().size(), 1);
}

}

我曾尝试将SessionFactory注入测试并调用SessionFactory#flush方法,但这不会引发CurrentContextSession错误,我似乎无法修复。

共有1个答案

萧煜
2023-03-14

终于解决了这个问题。

我一直在尝试注入EntityManager并从那里调用flush,但实际输出没有变化(代码仍然没有被调用)。

对我来说,解决方案的灵感来自这里,让我的最终测试看起来像这样:

@Test
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void testHistoryLogging() {
    Candidate cand = new Candidate();
    cand.setEmail("123@gmail.com");
    cand.setFirstName("12");
    cand.setLastName("3");

    cand = candidateRepository.save(cand);

    cand.setLastName("34");
    candidateRepository.save(cand);

    assertEquals(entityAuditEventRepository.findAll().size(), 1);

}

基本上每个调用都是以非事务性方式执行的,这会在调用存储库中的保存方法后将候选对象保存到数据库中。

 类似资料:
  • 我在pycharm中调试单元测试时遇到问题。我可以使用我的配置很好地运行它们,但当我运行调试器时,会得到以下错误输出: 我的目录结构是: 我的unittest配置是: 看起来像: 做什么?如何确保在调试期间找到它?问题实际上与正在查找的文件/目录无关吗?

  • 我不熟悉单元测试。参考google之后,我创建了一个测试类来测试我的控制器,如下所示: 我有以下控制器和服务类: 当我调试单元测试时,控制器中的p对象为null。我的状态是200,但不是预期的JSON响应 我错过了什么?

  • 在Spring Boot应用程序中,我访问Hibernate会话,如下所示:https://stackoverflow.com/a/33881946/272180 我的单元测试类类似于以下自动取款机: 引用具有用于运行Spring Boot应用程序的main方法的类。

  • 我已经创建了一个应用程序使用Springboot和Hibernate,我想配置它的单元测试。 首先,这是DAO接口。 这是DAO接口的实现 然后我创建了一个测试类,如下所示 我已经将application.properties文件放在test和src目录的资源中。 我尝试运行此单元测试用例,但由于以下错误而失败: 那么我可以知道为DAO层配置单元测试的最佳方法吗?

  • 晚安, 我正在对我的服务进行一些测试,在删除方法中执行测试时遇到了问题。 我想知道是否有人犯过这个错误,可以帮助我。 我扫描时出错。据报道,该方法没有使用。 例外情况: 代码:

  • 我使用Spring Web模块编写RESTAPI,使用WebClient类调用外部API,并使用block()方法等待响应。 我知道我应该使用Spring WebFlux以完全非阻塞的方式编写RESTAPI。但这不是一个选择。 我在编写单元测试和模拟WebClient时遇到问题。我在Stack Overflow中读到了一些WebClient模拟线程,但在我的案例中似乎没有一个能正常工作。 以下是我