A blog mainly about Java

How to unit test CRUD operations

I like to unit test CRUD (Create, Read, Update, Delete) operations for my domain objects as well as find all. I use the same template again and again, it’s quick to do and makes sure that the basic operations work. Here is what I do :

* A first find all to get all the objects from the database
* Create an object with random values and persist it into the database
* Find the created object from the database
* Make sure it exists
* Make sure it has the right random values
* Update the created object with other random values into the database
* Find the updated object from the database
* Make sure it still exists
* Make sure it has the new random values
* A second find all makes sure that there is one more object in the database
* Delete the object from the database
* Find the object from the database
* Make sure it doesn’t exist
* A third find all makes sure that there is the initial number of objects in the database

Here is the (simplified) JUnit code that tests the CRUD operations for an Item.

@Test
public void testCRUD() throws Exception {
// Gets two random numbers
Long random = getRandom();
Long updateRandom = getRandom();
// Item is the domain object
Item item = new Item();
// The method findAll brings back all the objects from the DB
int firstFindAll = findAll();
// Item gets mock values and is persisted. Id is returned
item = getMockItemValues(item, random);
persist(item);
Long id = item.getId();
// Find the created object with the given Id and makes sure it has the right values
item = find(id);
assertNotNull("Object should exist", item);
checkMockItemValues(item, random);
// Updates the object with new random values
item = getMockItemValues(item, updateRandom);
merge(item);
// Find the updated object and makes sure it has the new values
item = em.find(Item.class, id);
assertNotNull("Object should exist", item);
checkMockItemValues(item, updateRandom);
// Gets all the objects from the database...
int secondFindAll = findAll();
// ...and makes sure there is one more object
if (firstFindAll + 1 != secondFindAll) fail("The collection size should have increased by 1");
// The object is now deleted
remove(item);
// Find the object and make sure it has been removed
item = em.find(Item.class, id);
assertNull("Object should not exist", item);
// Gets all the objects from the database...
int thirdFindAll = findAll();
// ...and makes sure we have the original size
if (firstFindAll != thirdFindAll) fail("The collection size should have be the same as original");
}