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();
mockEmp.setEmpName(“bond”);
mockEmp.setEmpCode(“007”);List<Employee> empList= new ArrayList<Employee>(1);
empList.add(mockEmp);expect(mockDao.getEmpDetails()).andReturn(empList);
expect(mockDao.getEmpDetailsByName(“bond”)).andReturn(empList);
replay(mockDao);
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.
EasyMock.replay(mockDao);
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.verify(mock);
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.
hello beguiled to be coupled here. A small stimulant from me, things
that you mentioned is true, only sometimes there are about outside
factors that too mustiness be reasoned.
Though these factors testament greatly touch the final
stage result.
My modest opinion
Желание быстро Читаю и поинмаю, что сносный не понимаю о чем здравица:)
HI,
I’m getting a java.lang.noclassdeffounderror when trying to create a mock class for Component using EasyMock.
private Component mockComponent;
@SuppressWarnings(“restriction”) @Before public void setUp() { mockComponent = EasyMock.createMock(Component.class); }
Can anybody help urgently..
Thanks
On the test project go to Project->Properties and in Java Compiler make sure its level 5 (1.5).
Хм….надо же…всё так просто, а я этого не знал.
good one. EasyMock documentation sucks.
Евроремонт квартир
Думаю все из нас зареганы в какой-то из социальных сетей. И сегодня хочу поделится полезной ссылкой для пользователей Вконтакте – посмотреть друзей вконтакте
Вечер добрый. У меня есть вопрос по поводу контекстной рекламы у Вас на сайте. Вам не доводилось сталкиваться со случаями блокировки аккаунта администрацией гугла за якобы “накрутку”? Как защитить себя в этом случае?
Автор молодец. Затронул тему до глубины. Кстати хочу тоже поделится некоторыми открытиями – Сывороточная болезнь. Я сам в шоке
Последний из этих афоризмов уже цитировался в одной из дискуссий. Но мне очень хочется привести его и здесь. А ещё войти в круг уважаемых авторов: