“정적 반사”는 Java에서 어떻게 작동합니까? (예 : Mockito 또는 Easyymock에서)

StackOverflow https://stackoverflow.com/questions/626328

문제

저는 .NET Guy입니다 - 주로 C#의 코드입니다.

C# 3.0 이후, 우리는 람다 표현식과 표현 나무를 활용할 수 있습니다. 정적 반사. 예를 들어, 구현할 수 있습니다 GetMethodName 다음 스 니펫에서 매개 변수에 전달 된 메소드의 이름을 반환합니다.

string methodName = GetMethodName( o => o.DoSomething());
Console.WriteLine(methodName); // displays "DoSomething"

이제 Java 세계에서 Mockito 샘플 (또는 Easyymock)을 보면 다음을 볼 수 있습니다.

LinkedList mockedList = mock(LinkedList.class);
when(mockedList.get(0)).thenReturn("first");

어떻게 작동합니까?

어떻게 when 방법 작업? 어떻게 해석합니까? mockedList.get(0) ~처럼 0으로 전달 된 get 메소드에 대한 호출 매개 변수로 통과 그리고 가치가 아닌가?

도움이 되었습니까?

해결책

조롱 라이브러리는 일반적으로 발현 나무와 함께 작동하지 않습니다. 적절한 인터페이스를 구현하는 유형을 구축하고 메소드 호출을 녹음하거나 검증하고 사전 프로그래밍 된 응답을 반환하여 메소드 호출에 응답합니다. 이것은 일반적으로 프록시로 수행됩니다 (예 : RealProxy .NET에서 대리 Java) 또는 동적 코드 생성.

EasyMock의 경우 사용합니다 Proxy 소스 코드에서 볼 수 있듯이 (인터페이스의 경우) : org.easymock.internal.JavaProxyFactory.

다른 팁

Java Mock 라이브러리는 일반적으로 다음과 같이 작동합니다.

모의를 만들 때 실제 프록시가 생성됩니다 (인터페이스 또는 하위 클래스에서) 인스턴스는 "레코딩 모드"에 있습니다. 이는 후속 호출이 기록되었음을 의미합니다 (메소드 이름, 매개 변수, 예상 예상). 레코딩 모드의 프록시는 실제로 통화를 기록하는 것 외에는 아무것도 아닙니다. 반사 당사자는 관련이 없습니다. 메타 데이터 발견 등이 없습니다. 물론 이러한 라이브러리는 몇 가지 트릭을 수행하지만 (예 : 스레드-로컬 변수에 보유를 저장하여 void를 반환하는 메소드를 처리 함) 아이디어는 동일하게 유지됩니다.

그런 다음 "재생 모드"가 시작되면 모의 인스턴스는 단순히 호출 목록 (메소드+매개 변수 및 리턴 값)에서 기대치를 확인합니다.

나는 Mockito 또는 Easyymock과 함께 일한 적이 없지만 전화가 당신이 생각하는 일을한다고 생각하지 않습니다. 그것은 해석되지 않습니다 mockedList.get(0) 특별한 방식으로. 방법 get 에서 실행됩니다 mockedList 대상은 정상적으로, 그리고 결과 그 중 하나는 다음과 같습니다 when.

mockedList.get(0) 메소드 호출의 구문이며 정확히 수행합니다. 그 방법이하는 일은 정확히 명확하지 않습니다. mockedList의 런타임 유형은 서브 클래스입니다 LinkedList 반환 mock 조롱 프레임 워크가 어떻게 적합한 지 구현할 수있는 방법.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top