2016-08-04 2 views
2

스텁하는 동안 실제 메소드 호출하려고하는 모토로토에 문제가 있습니다. 나는이 메소드가 상속된다는 것과 관련이 있다고 가정한다. 이것은 내 시스템 외부의 구성 요소이며 실제로 그렇게 할 수 없습니다. 그러나의 코드에 내가 바로 두 번째 줄에 NPE를 얻을 다른 개체에 대한스텁 때 슈퍼 클래스에서 실제 메소드 호출 Mockito

AbstractRpcClient abstractRpcClient = mock(AbstractRpcClient.class); 
doNothing().when(abstractRpcClient).callOnce(anyString(), anyVararg()); 

callOnce 이후 통화 방법을 얻을 수 있습니다. AbstractRpcClient은 다른 추상 클래스를 상속하지만이 클래스는 패키지 로컬이므로 내 스텁에 캐스팅 할 수도 없습니다.

내가 할 수있는 일이 있습니까? 어떻게하면이 메소드를 스텁하여 아무 것도하지 않거나 실제 메소드를 호출하지 않고 예외를 던질 수 있습니다.

테스트에서이 클래스를 확장하고 메서드 callOnce을 재정의해야합니까? 이것은 물론 작동하지만 다른 해결책이 있습니까?

최소 예 : 코스 RuntimeException의 예에서는

package mypackage 

import static org.mockito.Matchers.anyString; 
import static org.mockito.Matchers.anyVararg; 
import static org.mockito.Mockito.doNothing; 
import static org.mockito.Mockito.mock; 

public class Testclass { 

    @Test 
    public void test() { 
     external.component.ClassToMock classToMock = mock(external.component.ClassToMock.class); 
     doNothing().when(classToMock).callOnce(anyString(), anyVararg()); 
    } 

} 

callOnce 방법에서 발생되는

package external.component; 

public abstract class ClassToMock extends SuperClass { 

} 


abstract class SuperClass { 
    public void callOnce(String method, Object... params) { 
     throw new RuntimeException("We shouldn't be here"); 
    } 
} 

테스트 클래스.

+1

public void callOnce() { super.callOnce(); }를 추가합니다. 메서드는 여기서 호출하면 안됩니다. – Tunaki

+0

같은 문제를 논의하는이 스레드를 살펴 보는 것이 좋습니다. http://stackoverflow.com/questions/3467801/mockito-how-to-mock-only-the-call-of-a-method-of-the -superclass –

+0

'external.component.ClassToMock'이 추상적 인 –

답변

1

이 Mockito에서 벌레처럼 보이는 사실은 이미보고되었다 년 전에 고정했는데 :

https://github.com/mockito/mockito/issues/168

나는 버전 1.9.5을 동일한 (깨진) 동작을 얻고있다 가장 최근 1.10.19.

나는 Mockito로 버그를 제기하는 것이 좋습니다. 임시 작업 주위에있다 몇 가지 옵션으로

:

  • 클래스 공공
  • 는 [mcve] 게시하시기 바랍니다 자식 클래스
+0

정보 주셔서 감사합니다. 그것은 2.0 이정표에있는 것 같습니다. 두 클래스 모두 외부 컴포넌트에서 왔지만이 메소드를 재정의하는 또 다른 하위 클래스를 만들었습니다. – Piotr

관련 문제