say class Employee 클래스의 mock 객체를 만들 때. Employee 객체의 생성자를 호출하지 않습니다. 내부적으로 Mockito는 CGLIb와 reflection을 사용하고, 클래스를 확장하여 모의하는 프록시 클래스를 생성합니다. 그것이 직원의 생성자를 호출하지 않는다면 어떻게 직원 클래스의 모의 인스턴스가 생성 되었습니까?mockito는 mock 객체의 인스턴스를 어떻게 만듭니 까
답변
Mockito는 CGLib을 사용하여 클래스 객체를 생성합니다. 그러나이 클래스 객체를 인스턴스화하려면 Objenesis http://objenesis.org/tutorial.html
Objenesis는 다양한 기술 (즉, ObjectStream.readObject 및 유사 호출)을 사용하여 생성자없이 객체를 인스턴스화 할 수 있습니다.
Objenesis – bakoyaro
에 대한 링크 끊어진 링크 분명히 새 도메인으로 이동했으며 프로젝트가 github에 있습니다. 나는 링크를 고쳤다. –
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()를 선언하고 일부 기본 로그인을 생성하여 직접 테스트 할 수 있습니다.
- 1. ParameterizedType이 주어지면이 유형의 인스턴스를 어떻게 만듭니 까?
- 2. Prism4 MEF에서 클래스의 인스턴스를 어떻게 만듭니 까?
- 3. 여기에서이 메서드의 인스턴스를 어떻게 만듭니 까?
- 4. 내 프로젝트의 어셈블리에 대한 참조없이 내 App.Config에 정의 된 객체의 인스턴스를 어떻게 만듭니 까?
- 5. Perl 클래스는 어떻게 만듭니 까?
- 6. Catalyst에서 세션을 어떻게 만듭니 까?
- 7. 게임 바닥을 어떻게 만듭니 까?
- 8. 사전 항목은 어떻게 만듭니 까?
- 9. 이벤트 구독자는 어떻게 만듭니 까?
- 10. 컨테이너 파일은 어떻게 만듭니 까?
- 11. EDM에서 데이터베이스를 어떻게 만듭니 까?
- 12. 페이지 템플리트는 어떻게 만듭니 까?
- 13. 싱글턴 IEnumerable은 어떻게 만듭니 까?
- 14. 바이너리 패치는 어떻게 만듭니 까?
- 15. 모바일 사이트는 어떻게 만듭니 까?
- 16. 포인터의 배열은 어떻게 만듭니 까?
- 17. JSON Array는 어떻게 만듭니 까?
- 18. 빈 op_array는 어떻게 만듭니 까?
- 19. gitosis에서 머리를 어떻게 만듭니 까?
- 20. RSS 피드는 어떻게 만듭니 까?
- 21. 동적 URL은 어떻게 만듭니 까?
- 22. 소셜 그래프는 어떻게 만듭니 까?
- 23. CruiseControl.Net에서 속성을 어떻게 만듭니 까?
- 24. 제한된 AppDomain은 어떻게 만듭니 까?
- 25. UISplitView를 수동으로 어떻게 만듭니 까?
- 26. 런타임에 객체를 어떻게 만듭니 까?
- 27. 맞춤식 날짜는 어떻게 만듭니 까?
- 28. String에서 org.xml.sax.InputSource를 어떻게 만듭니 까?
- 29. Android에서 계기는 어떻게 만듭니 까?
- 30. PyroCMS에서 자동으로 위젯을 어떻게 만듭니 까?
나는 당신의 최선의 방법이 souce 코드를 보는 것이라고 생각한다. 내 이해를 위해 모의 클래스 생성은 ClassImposterizer 클래스의 "부작용"메서드에서 발생합니다. 위에서 언급 한 클래스에 대한 링크는 다음과 같습니다. http://mockito.googlecode.com/svn/trunk/src/org/mockito/internal/creation/jmock/ClassImposterizer.java – sateesh