2011-05-10 6 views
4

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

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

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

+0

Доступны ли какие-либо из этих ответов для вас? –

ответ

4

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

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

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

+0

Ссылка не работает. –

1

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

+0

О большинстве/всех. Все наборы Java наследуются от одного и того же интерфейса, поэтому, если вы возвращаете удаленный объект, все это делают. –

+1

Это все верно и правильно, однако очень немного не хватает намерения теста (как я понимаю). Тестирование, если 'PersonManager.delete()' возвращает экземпляр 'Person', не совпадает с тестированием, если он вызывает' PersonDao.delete() '. –

+0

'PersonPanager.delete()' может возвращать 'boolean' .. –

6

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

obj = createMock(...) 
obj.someVoidMethod(); 
replay(obj); 
... 
verify(obj); 
0

Mockito предоставляет статический метод verify, который может проверять, когда вы вызываете какой-либо метод, даже те, которые имеют недействительный тип возврата. Для вашего образца кода должен работать следующий код 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); 
    } 
} 

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

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