我正在尝试测试我的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
错误,我似乎无法修复。
答案 0 :(得分:0)
最后成功解决了这个问题。
我一直在尝试做的是注入 WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));
并从那里调用flush,但实际输出没有变化(代码仍未被调用)。
我的解决方案受到here的启发,使我的最终测试看起来像这样:
EntityManager
基本上每个调用都是非事务性执行的,这会在调用存储库中的save方法后将候选者保存到数据库中。