2011-01-13 3 views
4

У меня возникла проблема с возвратом EasyMock null для ожидаемого (определенного) вызова метода.EasyMock возвращает Null для ожидаемого метода

Создание объекта Посмешищем

mock = EasyMock.createMock(DAO.class); 

Тестовая модель создана в тестовом модуле.

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» - это тот же объект, который я определил в модульном тесте. Я также не испытывал эту проблему (что я знаю) с любыми другими методами, которые насмехались.

Возможно, проблема связана с объектом, который передается?

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

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

public class TestMyService extends EasyMockHelper {...} 

ответ

7

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

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

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

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); 
    } 
} 
+0

Другой «ключ», чтобы расширить свой случай класс тест с EasyMockSupport. – d0nut

Смежные вопросы