Метод насмешливой пустоты с EasyMock и Mockito - PullRequest
4 голосов
/ 10 мая 2011

Здравствуйте, я хотел бы знать, каков наилучший подход к макетированию пустотных методов, например: у меня есть тестируемый PersonManager, а затем у меня есть дао, который имитируется.

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
    }
}

То есть метод тестирования с возвратом был простым, но как установить метод void? Спасибо за предложения, и примеры Mcokito тоже приветствуются. }

Ответы [ 4 ]

6 голосов
/ 10 мая 2011

С легким макетом вам не нужно оборачивать пустые функции ожиданием (). Вам просто нужно сделать что-то вроде:

obj = createMock(...)
obj.someVoidMethod();
replay(obj);
...
verify(obj);
4 голосов
/ 10 мая 2011

Это полностью зависит от что вы пытаетесь проверить.

В mockito, если вы хотите проверить только то, что метод удаления DAO вызывается с правильным параметром, тогда verify - это то, что вам нужно.

Я бы предположил, что это именно то, что вам нужно, поскольку ваш модульный тест для PersonManager не должен проверять PersonDao.

1 голос
/ 10 мая 2011

При удалении чего-либо я предлагаю вернуть объект, который вы только что удалили. Это значительно упрощает тестирование и позволяет выполнять действия после удаления (например, показ уведомления, ведение журнала и т. Д.). Я думаю, что большинство (все?) Коллекции Java делают это.

0 голосов
/ 12 мая 2011

Mockito предоставляет статический метод verify, который может проверять, когда вы вызываете любой метод, даже те, которые имеют void в качестве возвращаемого типа.Для вашего примера кода следующий код mockito должен работать:

// Put this among your import statements    
import static org.mockito.Mockito.*

class PersonManagerTest {

    private PersonManager manager; // SUT

    private Map<String, Person> mockedPersons;

    private PersonDao mockDao;

    // Don't forget to setup from scratch for each test
    @Before public void setup() {
        mockDao = mock(PersonDao.class); // mockito mock method
        mockedPersons = new HashMap<String, Person>();
        for (int i=1; i<=3; i++) {
            mockedPersons.put("person"+i, mock(Person.class));
        }
        manager = new PersonManager(mockDao);
    }

    // setup dao to return a mocked person
    private void whenPersonIsAdded(int i) {
        Person personToReturn = mockedPersons.get("person"+i);
        when(mockDao.find("person"+i)).thenReturn(personToReturn);
    }

    @Test public void shouldReturnExistingPerson() {
        whenPersonIsAdded(1);
        Person expectedPerson = mockPerson;

        Person actualPerson = manager.find("person1");

        assertEquals(expectedPerson, actualPerson);
    }

    @Test public void shouldDeleteExistingPerson() {
        String expectedPersonString = "person1";

        manager.delete(expectedPersonString);

        verify(mockDao).delete(expectedPersonString);
    }
}

Надеюсь, это поможет.

...