2013-08-01 2 views
0

중첩 함수 호출의 시나리오에서 모의 ​​테스트에 심각한 개념적 문제점이 있습니다. 내 프로젝트에서 JUnit과 Mockito를 사용하고 있습니다. 내가 다음 예와 내 문제를 설명하자 -중첩 함수 호출을위한 모의토 모의 테스트

public class ClassA { 
     public void methodOne(param1, param2, param3, param4) { 
      // do something 

      String temp = methodTwo(param2, param3, param4); 

      // do something 
     } 

     public String methodTwo(param2, param3, param4) { 
      // do something 

      return methodThree(param2, param3) + methodFour(param4); 
     } 

     public String methodThree(param2, param3) { 
      // do something 
      return param2.get(0).getIndex + ":" + param3.getPosition(); 
     } 

     public String methodFour(param4) { 
      // do something 

      return param4.getDetail() + "|" + param4.getCount(); 
     } 
    } 

을 우리가 methodThree()methodFour() 같은 기본적인 방법을 테스트해야하는 경우, 우리는 (기능 테스트중인의 executtion을 지원하기 위해) 필요한 스터 빙에 필요한 PARAMS의 모의 객체를 생성 할 수 있습니다 그곳에서 실행 및 검증 (상태/행동)을 수행하십시오.

그러나 methodTwo() 같은 메소드는 이미 별도의 단위로 테스트 된 다른 함수를 중첩 호출합니다. 모의 객체를 methodTwo()에 전달하면 중첩 된 메소드로 전달되어 NullPointerException()으로 표시됩니다. 이러한 모의 객체는 중첩 된 함수 호출의 필요에 따라 스텁되지 않았습니다. 확실하게, 우리는 mocks에 여분의 스터 빙을 추가하여 중첩 된 호출에서도 원활한 실행을 지원할 수 있지만 이것은 분명 건강한 방법은 아닙니다. 우리가 methodOne() 또는 다른 어떤 것과 같은 큰 방법으로 이동할 때 스터 빙의 이러한 부담은 더 심해질 것입니다.

유닛 테스트에 관한 한, 테스트중인 유닛 이외에 다른 유닛에 대해서는 신경 쓰지 않습니다. 제가 틀린 위치를 안내하고 Unit and mock testing의 더 나은/적절한 방법을 제안하십시오. 감사.

답변

1

내 생각에 여기에 methodOnemethodTwo은 어떤 종류의 사양을 충족해야하는지에 대한 생각이 있습니다. 같은 클래스의 다른 메소드에 대한 호출을 통해 이들 각각을 구현하도록 선택한 사실은 부적합합니다. 그들의 행동이 올바른지 테스트해야합니다. 테스트를 작성할 때 구현을 보지 말고 사양을 살펴보십시오.

물론 내 충고를 무시한다면 Mockito 스파이를 사용할 수 있으며 다른 사람들을 테스트하는 동안 몇 가지 방법을 스텁 할 수 있습니다. 그러나 진지하게,하지 마십시오.

+1

David, 귀하의 제안에 동의합니다. 이제, 내가 틀렸다면 나를 바로 잡으십시오 - 행동 테스트는 테스트중인 메소드가 예상 한 문장을 따르고 있는지 확인하는 것입니다. 원하는 행동이나 명세를 보장하기 위해 필요한 것. 함수 안에서 수행되는 실제 구현에 신경 쓰지 않고 어떻게이를 수행 할 수 있습니까? "사양보기"라는 용어로 상태 확인을 의미합니까? 지식 격차를 해소하기위한 적절한 참조를 명확히 제시하고 제공하십시오. 감사. –