2010-06-29 3 views
7

say class Employee 클래스의 mock 객체를 만들 때. Employee 객체의 생성자를 호출하지 않습니다. 내부적으로 Mockito는 CGLIb와 reflection을 사용하고, 클래스를 확장하여 모의하는 프록시 클래스를 생성합니다. 그것이 직원의 생성자를 호출하지 않는다면 어떻게 직원 클래스의 모의 인스턴스가 생성 되었습니까?mockito는 mock 객체의 인스턴스를 어떻게 만듭니 까

+1

나는 당신의 최선의 방법이 souce 코드를 보는 것이라고 생각한다. 내 이해를 위해 모의 클래스 생성은 ClassImposterizer 클래스의 "부작용"메서드에서 발생합니다. 위에서 언급 한 클래스에 대한 링크는 다음과 같습니다. http://mockito.googlecode.com/svn/trunk/src/org/mockito/internal/creation/jmock/ClassImposterizer.java – sateesh

답변

6

Mockito는 CGLib을 사용하여 클래스 객체를 생성합니다. 그러나이 클래스 객체를 인스턴스화하려면 Objenesis http://objenesis.org/tutorial.html

Objenesis는 다양한 기술 (즉, ObjectStream.readObject 및 유사 호출)을 사용하여 생성자없이 객체를 인스턴스화 할 수 있습니다.

+0

Objenesis – bakoyaro

+2

에 대한 링크 끊어진 링크 분명히 새 도메인으로 이동했으며 프로젝트가 github에 있습니다. 나는 링크를 고쳤다. –

1

Mockito는 리플렉션 및 CGLib을 사용하여 동적으로 생성 된 수퍼 클래스로 Employee 클래스를 확장합니다. 이 작업의 일환으로, 기본 생성자를 포함하여 Employee의 모든 생성자를 public으로 만드는 것으로 시작합니다.이 생성자는 매개 변수를 사용하는 생성자를 선언 한 경우에는 여전히 주위에 있지만 비공개입니다.

public <T> T imposterise(final MethodInterceptor interceptor, Class<T> mockedType, Class<?>... ancillaryTypes) { 
    try { 
     setConstructorsAccessible(mockedType, true); 
     Class<?> proxyClass = createProxyClass(mockedType, ancillaryTypes); 
     return mockedType.cast(createProxy(proxyClass, interceptor)); 
    } finally { 
     setConstructorsAccessible(mockedType, false); 
    } 
} 

private void setConstructorsAccessible(Class<?> mockedType, boolean accessible) { 
    for (Constructor<?> constructor : mockedType.getDeclaredConstructors()) { 
     constructor.setAccessible(accessible); 
    } 
} 

슈퍼 클래스가 생성 될 때 기본 생성자를 호출한다고 가정합니다. 아직 테스트하지는 않았지만. 개인 기본 생성자 인 Employee()를 선언하고 일부 기본 로그인을 생성하여 직접 테스트 할 수 있습니다.

+0

언제든지 기본 생성자를 호출하지 않습니다. – Cshah

+0

감사합니다. 나는 그것에 대해 궁금해했습니다. – Lunivore

+0

Mockito는 생성 된 클래스의 생성자를 호출합니다 (대상 유형의 생성자를 호출 할 때의 부작용을 피할 수 있음). – iwein

관련 문제