在单元测试中没有调用Hibernate的PreUpdateEventListener

时间:2016-07-04 11:20:37

标签: java spring hibernate junit

我正在尝试测试我的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方法,但是这会引发No CurrentContextSession错误,我似乎无法修复。

1 个答案:

答案 0 :(得分:0)

最后成功解决了这个问题。

我一直在尝试做的是注入 WebDriverWait wait = new WebDriverWait(driver, 10); wait.until(ExpectedConditions.elementToBeClickable(By.id("someid"))); 并从那里调用flush,但实际输出没有变化(代码仍未被调用)。

我的解决方案受到here的启发,使我的最终测试看起来像这样:

EntityManager

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