2011-08-27 1 views
2

이 시나리오에서 어떻게 부분적 조롱을하지 않습니까?

public class ValueFinder { 

    public String findValue(Object obj) { 
     String value = null; 
     value = findValueFirstWay(obj); 
     if (value == null) { 
      value = findValueSecondWay(obj); 
     } 
     return value; 
    } 

    protected String findValueFirstWay(Object obj) { 
     .... 
    } 

    protected String findValueSecondWay(Object obj) { 
     .... 
    } 
} 

이제 findValueFirstWay가 실제로 findValue을 호출 할 때 시도 된 첫 번째 방법인지 테스트하고 싶습니다. 이것은 매우 간단한 클래스이며, 방법의 "알고리즘"은 매우 간단합니다. findValueFirstWayfindValueSecondWay가 조롱을 당하고 findValue이 홀로 남겨진 부분적인 모의를하지 않고 어떻게 테스트 할 수 있습니까?

findValueFirstWayfindValueSecondWay가 별도의 클래스 또는 클래스에 있도록 클래스를 리팩터링한다고 가정합니다. 이렇게 단순한 무언가를 위해 불필요한 작업처럼 보인다.

답변

1

실물과 함께 보이는 효과로 완전히 조롱하거나 테스트 할 필요가 없습니다.

아니면 객체가 값으로 전달되고 조롱하고 findValueFirstWay(Object obj)가 널을 반환하는 원인이 obj에 대해 수행하는 호출 어떤 기대할 수 등

그러나, 간단 보인다하더라도, 내 첫 번째 충동은 문제가되는 방법을 별도의 클래스 또는 두 가지로 추출하여 상호 작용을 자연스럽게 모의 객체로 테스트 할 수 있습니다.

+0

저는 여러분이 옳다고 생각합니다. 클래스는 실제 입력을 만들고 실제 객체로 출력을 검증함으로써 완전히 테스트 될 수 있습니다. – Ryan

1

동의합니다. 전략 패턴을 사용하고 각 방법에 대한 전략 클래스를 정의 할 수 있지만, 간단한 상황에서 과도한 것처럼 보입니다. 나는 이것을 테스트하기 위해 부분적 모의를 사용하는 데있어 잘못된 것을 보지 못합니다.

+0

그건 내 생각이 바로 지금입니다. 부분적인 조롱에 대한 엄격한 규칙이있는 것처럼 보이지 않습니다. 많은 글쓰기 코드가 판단에 오며 사용시기에 대한 판단을 요구하는 것처럼 보입니다. 사용하는 경우 리팩터링이 필요할 수도 있습니다. – Ryan

0

단순히 하위 클래스 ValueFinder을 테스트에 사용하고 두 가지 보호 된 메소드를 무시하면 어떨까요? 이렇게하면 다른 곳으로 메소드를 이동하지 않고도 플래그, 변수 등을 사용하여 어떤 순서로 호출되었는지 추적 할 수 있습니다. 이것이 "부분적 조롱"의 일부 일지 모르지만 그렇지 않습니까?

+0

나는 주위를 둘러 보았고 서브 클래스를 찾고 override 메서드를 사용했다. 부분 모의 (partial mock)는 서브 클래스와 동일하지만 서브 클래스를 정의하는 것이 훨씬 더 간결하다는 이점이 있습니다. – Ryan

+0

@ Ryan 아마도 당신은 그 구별에 대해 옳을 것이다. 복잡한 논리가 필요할 때 하위 클래스가 더 적합합니다. 그런데 왜 조롱을 피하려고합니까? 하나의 메소드를 독립적으로 테스트하려는 경우에는 직선적 인 접근 방법 인 것 같습니다. –