2013-10-18 5 views
1

나는 단위 테스트에 익숙하며 적절한 스타일을 배우려고 노력하고 있습니다. 저는 새로 테스트 된 객체를 테스트하는 대신 사용중인 것처럼 테스트 할 수 있도록 테스트중인 객체를 설정하는 것을 좋아합니다. 비어있는 물체를 제거하는 것은 테스트 할 수 없습니다.Mockito에서 설정 한 후에 모의 설정을 재설정하는 올바른 방법은 무엇입니까?

ObservedList가 테스트되고 ListListener가 조롱되고있는 필수 클래스 인 경우에 대해 다음을 수행하십시오.

public final class ObservedListTest { 
    private ListListener<Integer> listener; 
    private ObservedList<Integer> list; 
    @BeforeMethod public void setup() { 
    listener = mock(ListListener.class); 
    list = new ObservedList<Integer>(listener); 
    list.addAll(Arrays.asList(1,2,3)); 
    reset(listener); 
    } 
    @Test public void addFirst() { 
    list.add(0, -1); 
    verify(listener).listEdited(list, 0, 1, Collections.<Integer>emptyList()); 
    verifyNoMoreInteractions(listener); 
    } 
    @Test void addAtEnd() { 
    list.add(9); 
    verify(listener).listEdited(list, 3, 4, Collections.<Integer>emptyList()); 
    verifyNoMoreInteractions(listener); 
    } 
    @Test void removeMiddle() { 
    list.remove(Integer.valueOf(2)); 
    verify(listener).listEdited(list, 1, 1, Collections.singletonList(2)); 
    verifyNoMoreInteractions(listener); 
    } 
} 

는 초보자로서이 나에게 잘 작동하는 것 같다,하지만 난 그것이 reset 방법을 사용하기 때문에 나쁜 습관이다 것을 알고있다. reset으로 전화를 걸기 때문에 실제 테스트가 설치 과정에서 발생한 상호 작용으로 인해 혼란스러워지기를 원하지 않기 때문입니다.

reset에 대한 javadoc은 사용하지 말라고 말하기 때문에 메소드가 무엇인지 알려주지 않습니다. 일반적으로 나는 단순히 조언을 내 setup 방법을 제거하고 더 같이 내 테스트를 조정하여 reset을 피할 것 :

@Test void removeMiddle() { 
    listener = mock(ListListener.class); 
    list = new ObservedList<Integer>(listener); 
    list.addAll(Arrays.asList(1,2,3)); 
    list.remove(Integer.valueOf(2)); 
    InOrder inOrder = inOrder(listener); 
    inOrder.verify(listener).listEdited(list, 0, 3, 
     Collections.<Integer>emptyList()); 
    inOrder.verify(listener).listEdited(list, 1, 1, 
     Collections.singletonList(2)); 
    verifyNoMoreInteractions(listener); 
    } 

나에게 잘 작동하는 것 같다. 문제는 reset 방법에 대한 설명서는 말한다이다 :

대신 리셋의() 간단하고 작은을 쓰고 고려하시기 바랍니다과 긴, 이상 지정 시험을 통해 시험 방법을 집중했다.

내가 Mockito는 단위 테스트에서 좋은 스타일을 장려하기 위해 설계 나는 그것으로부터 배우고 싶은 것을 존중하지만 나는 저를 보내려고 어떤 메시지를 가려 힘든 시간을 보내고 있습니다. 내 테스트에서 reset을 제거하면 테스트 결과 , 이 길어졌으며은 덜 집중된이므로 분명히 잘못하고 있습니다.

옳은 것처럼 보이는 것은 무엇입니까?

답변

2

reset을 제거하십시오. verifyNoMoreInteractions을 제거하십시오. 문제 해결됨. 테스트는보다 간단하고 짧으며 집중적입니다.

+0

그건 내 테스트를 훨씬 더 관대하게 만들 것입니다. ObservedList가 ListListener에 잘못된 메시지를 보낼 수 있다고 선언하지 않습니까? 나는 그것을 허용하고 싶지 않다. permissiveness가 좋은 것이라면 나는 테스트를 완전히 제거 할 수 있었고, 모든 것을 허용했다. 그리고 그것은 모두의 가장 간단 할 것이지만, 실제로이 것을 실제로 테스트하고 싶다. – Geo

+1

@Geo, Ryan은 [Mockito가 설계된] 테스트 용 철학 (http://monkeyisland.pl/2008/07/12/should-i-worry-about-the-unexpected/)을 설명하고 있습니다 (http : //docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#8). 취약하고 밀접하게 지정된 테스트보다 유연하고 느슨한 테스트를 선호합니다. 일반적으로 리스너 또는 콜백 동작을 테스트하지 않는 한 추가 메서드 호출로 인해 테스트가 실패하지 않아야합니다. 모든 호출을 예상하고 확인할 때까지 테스트 내에서 구현을 안쪽으로 복제했습니다. –

+0

@JeffBowman, 이것은 Mockito가 리스너 나 콜백을 조롱하는 데 사용해서는 안된다는 뜻입니까? 그것은 단지 자신의 테스트 철학에 사용되는 것에 의도 된 것처럼 보이지만 여러 개의 조롱 도구를 혼합하여 사용하는 것을 주저합니다. – Geo

관련 문제