Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

EasyMock returns Null for Expected Method

I have am having a problem with EasyMock returning null for an expected (defined) method call.

Creation of the mocked Object

mock = EasyMock.createMock(DAO.class);

Mock Set up in unit test.

expect(mock.update(myObj).andReturn(myObjUpdated).once();
replayAll();
service.setDao(mock);
service.processData(myObj);
verifyAll();

processData method simply calls

MyObject objUpdated = dao.update(myObj);

here is the interface that the mock is being built from.

public interface DAO {
   public <ENTITY> ENTITY update(ENTITY entity);
}

I am pretty confused by what might be causing the problem. I have confirmed that 'obj' is the same object as I defined in the unit test. I have also not experienced this problem (that I am aware of) with any other methods that mocked.

Could the problem possibly be with the Object that is being passed in?

Thanks in advance. I am really not sure what other information might be helpful to you here.

edit: this is the test class (and as it turns out where my misunderstanding began)

public class TestMyService extends EasyMockHelper {...}
like image 929
Seth M. Avatar asked Jan 13 '11 21:01

Seth M.


1 Answers

So it turns out that my main problem isn't with the expectations or even with the creation of the mock object. I had a fundamental misunderstanding about how the EasyMockSupport class which my test is extending functions. This isn't covered very well in the documentation, but if you exam the examples a bit more closely my error became obvious.

The EasyMockSupport class gives my test class access to methods such as replayAll(), verifyAll(), and resetAll(). what these do is allow me to now worry about manually controlling each created mock object. However, what the documentation failed to mention was that you have to create you Mock object USING the methods provided by the EasyMockSupport class so that it can properly register the controls. ((this makes total sense btw, I simply wasn't reading it anywhere)). The EasyMockSupport class if you look into the API provides the child class with all the methods that it would normally use statically from the EasyMock class, such as createMock(Class class).

So as for the updated code

public class TestMyService extends EasyMockSupport {
   private MyService service;
   private MyDao dao;

   private MyObject myObj;

   @Before public void setUp() {
      service = new MyService();

      // THIS IS THE KEY
      mock = createMock(IDao.class); //CORRECT
      // mock = EasyMock.createMock(IDao.class); //WRONG

      service.setDao(mock);
      myObj = new MyObject("expectedData");
   }
   @After public void tearDown() {
      verifyAll();
   }
   @Test public void testMyService() {
      expect(mock.update(myObj)).andReturn(myObj);
      replayAll();
      service.myService(myObj);
   }
}

public class MyService() {
   private IDao dao;
   public void setDao(IDao dao) {this.dao = dao; }
   public MyObject myService(MyObject myObj) {
      return dao.update(myObj);
   }
}
like image 127
Seth M. Avatar answered Nov 04 '22 08:11

Seth M.