2012-08-24 2 views
2

의 내가 중 하나가 기본적으로 추가 처리의 단지 작은 비트와 다른 방법에 대한 래퍼입니다 두 가지 방법을 가지고 있다고 가정 해 봅시다 :이 경우 부분 조롱에 어떤 문제가 있습니까?

public class ItemRepositoryImpl implements ItemRepository { 

    ... 

    @Override 
    public void delete(UUID itemID) { 

     Item item = findOne(itemID); 
     delete(item); 
    } 

    @Override 
    public void delete(Item item) { 

     // Do a bunch of stuff that needs a lot of tests run on it, like 
     // deleting from multiple data sources etc 
     ... 
    } 
} 

삭제 (UUID)에 대한 단위 테스트를 작성에 어떤 문제가 메서드를 사용하여 ItemRepositoryImpl을 부분적으로 숨기고 삭제 (UUID)가 결국 delete (Item)을 호출하는지 확인합니다. 이 작업을 수행했다면 각 삭제 방법에 대해 여러 개의 중복 테스트를 작성하지 않아도됩니다. 기본적으로 만 사용되어야한다는, 그러나, Mockito 문서 강하게 부분 조롱 이러한 유형의 사용을 권장하지

ItemRepository spyRepo = spy(repository);  // Create the spy 
when(spyRepo.findOne(itemID)).thenReturn(item); // Stub the findOne method 
doNothing().when(spyRepo).delete(item);   // Stub the delete(Item) method 
spyRepo.delete(itemID);       // Call the method under test 

// Verify that the delete(Item) method was called 
verify(spyRepo).delete(item); 

: Mockito에서

는,이 같은 스파이와 같은 테스트를 구현할 수 중간 레거시 코드 및 제 3 자 API 더 나은 해결책은 무엇일까요?

+0

정말 중복 테스트가 많이 있습니까? 'delete (UUID) '에 대한 두 개의 테스트 - 항목이있는 항목과 항목이 하나도없는 항목을 상상합니다. 호출의'delete (Item)'부분에서의 상세한 처리는'delete (Item)'에 대한 테스트들 사이에서 테스트됩니다. –

답변

1

순수한 단위 테스트를하고 있고 테스트 단위가 방법 인 경우 여기에서 조롱 한 것과 관련해서는 아무런 문제가 없다고 말할 수 있습니다. 어떤 사람들은 단위 테스트가 블랙 박스 접근 방식을 취해야하며, 메소드 호출을 조롱함으로써 테스트는 테스트중인 메소드의 구현에 대해 너무 많이 알고 있다고 주장 할 것이다.

테스트중인 유닛이 메소드가 아닌 클래스 인 경우 다른 클래스에 대한 호출을 모의 할 수 있습니다.

단위 테스트와 관련하여 항상 논쟁의 여지가 있습니다. 다음은 귀하의 질문과 매우 관련이있는 주제에 대한 흥미로운 기사입니다. http://martinfowler.com/articles/mocksArentStubs.html

관련 문제