Mocking void method with EasyMock and Mockito
Solution 1
It depends entirely on what you're trying to test.
In mockito, if you want to check only that the DAO delete method is called with the correct parameter, then verify is what you want.
I would suggest that this is exactly what you want since your unit test for PersonManager
should not be testing PersonDao
.
Solution 2
With easy mock, you don't need to wrap void functions around expect(). You just need to do something like:
obj = createMock(...)
obj.someVoidMethod();
replay(obj);
...
verify(obj);
Solution 3
When deleting something, I suggest returning the object you just deleted. It makes testing much, much easier and allows doing things after you deleted (e.g. showing notice, logging, etc). I think most (all?) Java collections are doing so.
Jarek
Updated on June 27, 2022Comments
-
Jarek almost 2 years
Hello I would like to know what is the best approach to mock void methods for example: I have a PersonManager under the test and then I have dao that is mocked.
class PersonManager { PersonDao dao... PersonManager(PersonDao dao)... Preson find(String person)... void delete(String person)... } class PersonManagerTest { Map<String, Person> persons ..... = "person1", "person2", "person3"; PersonDao mock... PersonManager manager = new PersonManager(mock); //easy one @Test public void shouldReturnExistingPerson() { expect(mock.find("person1").andReturn(persons.get(0)); Person result = manager.find("person1"); // replay and verify logic } //but what should I do here? @Test public void shouldDeleteExistingPerson() { //should I remove a person from testing Map holding test data? or what am I doing wrong } }
So testing method with return was easy but how to toset void method? Thank you for suggestions, and Mcokito examples are welcomed too. }
-
Sean Patrick Floyd almost 13 yearsAbout most / all. All Java collections inherit from the same interface, so if one returns the deleted object, all do.
-
Alan Escreet almost 13 yearsThis is all true and correct, however very slightly misses the intent of the test (as I understand it). Testing if
PersonManager.delete()
returns aPerson
instance is not the same as testing if it callsPersonDao.delete()
. -
Alan Escreet almost 13 yearsAgain true, but then you're testing if it returns true/false, not that the DAO is being called with the correct parameter.
-
Arunchunaivendan about 7 yearsThe link is broken.