2011-05-10 4 views
4

안녕하십니까. 예를 들어 무효 메소드를 모의 실험하는 가장 좋은 방법이 무엇인지 알고 싶습니다. 나는 PersonManager를 테스트 한 다음 조롱 한 mao를 사용하고 있습니다.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 
    } 
} 

따라서 반환 방법은 간단하지만 void 메소드를 사용하는 방법은 무엇입니까? 제안 해 주셔서 감사 드리며, Mcokito 사례도 환영합니다. }

+0

이러한 대답 중 하나라도 받아들입니까? –

답변

4

상황에 따라 다르다 : 당신은 같은 것을 할 필요가있다.

mockito에서 올바른 매개 변수를 사용하여 DAO 삭제 메소드가 호출되었다는 것을 확인하려면 verify이 원하는 것입니다.

PersonManager 단위 테스트에서 PersonDao을 테스트해서는 안되기 때문에 원하는 결과라고 생각합니다.

+0

링크가 끊어졌습니다. –

1

삭제할 때 방금 삭제 한 개체를 반환하는 것이 좋습니다. 테스트를 많이하고 훨씬 쉽게하며 삭제 한 후에 일을 처리 할 수 ​​있습니다 (예 : 통지, 로깅 등을 보여줌). 나는 대부분의 (모든?) Java 콜렉션이 그렇게하고 있다고 생각한다.

+0

대다수/전체. 모든 Java 콜렉션은 동일한 인터페이스에서 상속되므로 삭제 된 오브젝트를 리턴하면 모두 수행됩니다. –

+1

이것은 사실이며 정확합니다. 그러나 테스트의 의도를 아주 약간 잃어 버립니다 (필자가 이해함). 'PersonManager.delete()'가'Person' 인스턴스를 리턴하는지 테스트하는 것은'PersonDao.delete()'를 호출 할 때 테스트하는 것과 동일하지 않습니다. –

+0

'PersonPanager.delete()'는'boolean'을 반환 할 수 있습니다 .. –

6

모의가 간단하기 때문에 expect() 주위에 void 함수를 포함 할 필요가 없습니다. 테스트하려는 어떤 완전히

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

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

희망이 있습니다.