Importance of flushing data in unit test cases
While writing unit test cases, it is a good practice to clear and flush the session. When an application is executed in real time, there are several requests, responses or different transactions due to which the session/cache gets cleared. On the other hand, while running a unit test, everything happens as part of a single process i.e the session (especially hibernate) has rotten values or old references which leads to raising of certain exceptions at times.
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.ptc.fusion.model.learningitem.OnlineCourse#1] at org.hibernate.engine.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:613) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate
Code Example :
MapmapBeforeUnMapping = learningItemService.findEquivalentLearningItems(c2); assert mapBeforeUnMapping.size() == 2; assert mapBeforeUnMapping.values().contains(c1); assert mapBeforeUnMapping.values().contains(c2);
boolean unMappingSuccessful = learningItemService.unMapEquivalentLearningItem(c1); assert unMappingSuccessful;
Hence it is always a good practice to clear/flush session after repository calls or hibernate transactions to make a unit test case robust.