2016-07-04 30 views
0

我想測試我的PreUpdateEventListener流,但我似乎無法使其在JUnit測試中工作。我沒有收到任何錯誤,但代碼沒有被調用。未在單元測試中調用Hibernate的PreUpdateEventListener

我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("[email protected]"); 
    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

終於設法解決這個問題。

我一直試圖做的是注入EntityManager並從那裏調用flush,但實際輸出沒有變化(代碼仍未被調用)。

對我來說,溶液從here使得激發了我最終的測試是這樣的:

@Test 
@Transactional(propagation = Propagation.NOT_SUPPORTED) 
public void testHistoryLogging() { 
    Candidate cand = new Candidate(); 
    cand.setEmail("[email protected]"); 
    cand.setFirstName("12"); 
    cand.setLastName("3"); 

    cand = candidateRepository.save(cand); 

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

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

} 

基本上每次調用執行非事務,從庫中保存方法後,節省了候選人到數據庫叫做。