2014-11-24 4 views
0

java 및 spring과 함께 mockito 및 developping을 사용하고 있습니다.mockito : 리플렉션을 통해 매개 변수가있는 모의 메서드 호출

저는 일부 개발자를 위해 테스트 API를 개발 중이며 객체와 메소드를 조롱하는 몇 가지 방법을 제안합니다 (이는 레거시 코드입니다 ...). 이제이 모든 것을 mockito로 바꾸고 싶지만 항상 테스트 API를 제안합니다. 그래서, 나는 mockito를 사용하여 몇 가지 방법을 개발했다.

두 개의 매개 변수 (String)를 가진 이전 메서드가 있습니다. 첫 번째 매개 변수는 조롱 된 서비스 ID와 매개 변수가있는 메소드입니다. 두 번째 매개 변수는 반환 된 Object입니다. 예 : mockito이 필요하기 때문에 지금

mockReturnObject("myServiceId.myMethod(String, Integer)", myReturnedObject); 

, 나는 모의 언제 thenReturn의 mockito 방법을 사용하려면, 내가 어떻게 ... 아마도 반사와 만 함께 볼 수 없습니다 "때"방법은 불가능 효과적인 방법. 어떻게하면됩니까? 감사.

+0

나는 "진짜 물건"에 직접 mockito를 사용할 수없는 이유를 모르겠다. '최종'모의하고 싶은 수업 (또는 어떤 방법)이 있습니까? – fge

+0

"myServiceId.myMethod (String, Integer)"를 구문 분석하는 방법을 묻는 중입니까? 그렇다면 정말 가능하지 않습니다. –

+1

여기에서 테스트하려는 것을 좀 더 구체적으로 예시하는 것이 좋을 것이라고 생각합니다. 완벽한 테스트 방법, 완벽한 시나리오 또는 단순함. 집에서 조롱 한 프레임 워크를 조롱하고 있습니까? – macias

답변

3

이것은 나쁜 생각입니다. 은 Mockito가 제공하는 시스템 중 일부를 다시 구현하려고 시도 중입니다. Mockito는의 많은 기능을 잃어 버렸습니다. 그러나 몇 가지 어려움과 함께이 작품을 만드는 방법이 있습니다. 핵심은 custom Answer을 쓰고 모의에 default answer으로 만든 다음 InvocationOnMock을 사용하여 개체, 메서드 이름 및 메서드 매개 변수 유형을 비교합니다. 그 시점에서

public class ReflectiveMockAnswer implements Answer<Object> { 
    @Override public Object answer(InvocationOnMock invocation) { 
    // Assume you've successfully parsed each String into a StubbedResponse, with 
    // Object target, String method, String[] argTypes, and Object returnValue. 
    // A Set would beat a for-loop here, should you need to optimize. 
    for (StubbedResponse stubbedResponse : allStubbedResponses) { 
     if (stubbedResponse.target == invocation.getMock() 
      && stubbedResponse.method.equals(invocation.getMethod().getName()) 
      && stringArraysEqual(stubbedResponse.argTypes, 
       typeNamesFrom(invocation.getMethod().getParameterTypes())) { 
     return stubbedResponse.returnValue; 
     } 
    } 
    throw new RuntimeException("Unstubbed method called."); 
    } 
} 

// Later... 
Object yourMockObject = Mockito.mock(classToMock, new ReflectiveMockAnswer()); 

, 당신은 내 Mockito 의 단순화 된 버전을 구현 Mockito의 전체 버전을 기반으로했습니다. 의 모의와 해당 필드를 교체
  • 이름
  • 하여 빈 테스트 대상의 필드를 식별 아마 정규 표현식,

    • 가 StubbedResponse로 문자열을 구문 분석 : 당신은 또한해야합니다

        : 빈-에서 테스트하기 전에, 위와 같이 생성 된 해당 클래스는, 그

      와 상호 작용 ...이 솔루션은 처리하지 않음을 인정 할 수있는 기회를 가지고 기본 "동일"매개 변수 유형에

    • 이름 충돌 일치 (com.bar.SomeClass 대 com.foo.SomeClass)
    • 반복 호출 (thenReturn(1, 2, 3).thenThrow(new RuntimeException()))
    포함
  • 검증
  • 인수 일치하는 모든 종류의,

    ...및 수 없습니다 핸들 :

    • 코드 검색 도구 : 만이 아니라 이클립스 방식 Mockito 수
    • 컴파일 - "를 참조 찾기"와 같은 도구를 사용하여 문자열을 검색하여이 아닌 조롱하는 방법을 알 수 있습니다 시간 확인 및 자동화 된 리팩토링 도구 : 필드 이름, 메소드 이름 또는 매개 변수가 변경되면 런타임에 테스트가 중단됩니다. Mockito는 할 수없는, 그래서 이것은 "허수아비"또는 매우 일시적인 해결책이 아니라면 당신도

    , 방금 Mockito을 소개 강하게 추천 할 수 없습니다 Mockito는

  • 마지막 방법으로 그 문제를 가지고 있지 않습니다 한 번에 하나씩 테스트 케이스에 직접 입력하십시오.

  • 관련 문제