EasyMock возвращает Null для ожидаемого метода - PullRequest
6 голосов
/ 14 января 2011

У меня проблема с EasyMock, возвращающей ноль для ожидаемого (определенного) вызова метода.

Создание смоделированного объекта

mock = EasyMock.createMock(DAO.class);

Mock, настроенный в модульном тесте.

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

Метод processData просто вызывает

MyObject objUpdated = dao.update(myObj);

, вот интерфейс, из которого создается макет.

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

Я довольно смущен тем, что может бытьвызывая проблему.Я подтвердил, что obj - это тот же объект, который я определил в модульном тесте.Я также не сталкивался с этой проблемой (которую я знаю) с другими методами, которые высмеивали.

Может ли быть проблема с Объектом, который передается?

Заранее спасибо,Я действительно не уверен, какая другая информация может быть вам полезна здесь.

edit: это тестовый класс (и, как выясняется, с чего началось мое недоразумение)

public class TestMyService extends EasyMockHelper {...}

1 Ответ

10 голосов
/ 14 января 2011

Так что получается, что моя главная проблема не в ожиданиях или даже в создании фиктивного объекта.У меня было фундаментальное недоразумение о том, как класс EasyMockSupport, который в моем тесте расширяет функции.Это не очень хорошо освещено в документации, но если вы внимательно рассмотрите примеры, моя ошибка станет очевидной.

Класс EasyMockSupport предоставляет моему тестовому классу доступ к таким методам, как replayAll (), verifyAll () и сбросить все ().теперь они позволяют мне беспокоиться о ручном управлении каждым созданным фиктивным объектом.Однако в документации не упоминалось, что вы должны создать свой объект Mock, ИСПОЛЬЗУЯ методы, предоставленные классом EasyMockSupport, чтобы он мог правильно зарегистрировать элементы управления.(кстати, это имеет смысл, я просто нигде не читал)).Класс EasyMockSupport, если вы посмотрите на API , предоставляет дочернему классу все методы, которые он обычно использует статически из класса EasyMock, такие как createMock (класс Class).

для обновленного кода

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);
   }
}
...