Unit testing is now a "best practice" for software development. In this unit testing we have to face so many situations where we need to interact with Database or any other resources. But at the same time we need to make our Tests isolated too. Here comes the importance of Mock objects.
Mock objects are a useful way to write unit tests for objects that act as mediators. “Instead of calling the real domain objects, the tested object calls a mock domain object that merely asserts that the correct methods were called, with the expected parameters, in the correct order.”
Using EasyMock Framework
EasyMock is a framework for creating mock objects using the java.lang.reflect.Proxy object. When a mock object is created, a proxy object takes the place of the real object. The proxy object gets its definition from the interface or class you pass when creating the mock.
EasyMock is providing two APIs for creating mock objects that are based on interfaces, the other on classes (org.easymock.EasyMock and org.easymock. classextensions.EasyMock respectively).
We can separate the EasyMock implementation into FOUR steps
1. Creating a Mock Object using “EasyMock.createMock”.
Create Mock : Using this static method we are creating a mock object. And this is the first step which we need to do in mock testing.
When we creates this mock objects then we can follow three levels.
Regular: If we are expecting some methods to be executed then it was not executed then the test will fail. And if any unexpected tests executed then also test will fail. Here the order of the method execution is not important.
Ex: EmpDAO empDAO = EasyMock.createMock(EmpDAO.class);
Nice: If we are expecting some methods to be executed then it was not executed then the test will fail. And if any unexpected tests executed then it will return a default value. Here also order is not important.
Ex: EmpDAO empDAO = EasyMock.createNiceMock(EmpDAO.class);
Strict: Same as regular but here the Order of the expected methods also important.
Ex: EmpDAO empDAO = EasyMock.createStrictMock(EmpDAO.class);
2. Expecting mock object method calls using “EasyMock.expect”.
This is used to expect some method calls from our mock object. Lets go through one example.
Lets assume we have the following methods which gets employee information from DB.
List<Employee> employee = empDao.getEmpDetails();
List<Employee> employee = empDao.getEmpDetailsByName(“bond”);
In the unit test we need to follow as follows…
EmpDao mockDao = EaskMock.createMock(EmpDao.class);
Employee mockEmp = new Employee();
List<Employee> empList= new ArrayList<Employee>(1);
3. Registering/replaying expected methods using “EasyMock.replay”.
Once the behavior of the mock objects has been recorded with expectations, the mock objects must be prepared to replay those expectations. We are using replay() method for this purpose. EaskMock will stop the expecting behavior once this method calls.
4. Verifying the expected methods using “EasyMock.verify”.
Veirfying the mock expectations is the final step which we need to follow. This includes validating that all methods that were expected to be called were called and that any calls that were not expected are also noted.
Easymock is providing more functionalities like “Matchers” etc for more unit testing flexibility. EasyMock has been the first dynamic Mock Object generator, relieving users of hand-writing Mock Objects, or generating code for them. It helps us to increase our testing coverage a lot.
Yesterday I had attended Sun Developers Conference held here in Hitex Convensional center, Hyderabad, India. It was day ONE of three days conference. The day ONE was really interesting and informative for me. Got an overview about the new Sun techs and got chance to interact with a lot of developers working in Java.
We reached there aroung 9.30 in the morning and done with our registration formalities. The first seesion as Sun keynote bye Rich Green, Executive Vice President, Software, Sun microsystems. After that there was a Demo showcase in which SIX SUN java professionals presented some software demos. Those were in jMaki, Sun SPOTS, J2ME, Swing, JavaFX etc. There are 30 sessions total in the First day and those are from 5 different categories. Five sessions are going on the same time and the whole day is divided in to Six layers. So a delegate can select a session as per his/her taste. If a person is attentding full sessions then they can attent maximum 6 sessions in a day.
The Sessions which I had attened are
1. JEE , Glassfish and their future
2. Testing with Junit and other Testing tools
3. Rapid development with Ruby, JRuby and rails
4. Java Persistence API : Further simplifying persistence.
5. Java troubleshooting tips.
6. JEE with Spring ad Seam.
You can check the other sessions here
The first day ended with a Welcome reception – delicious Dinner and a Music Mela. 🙂 You can read more about each sessions in my next posts…