“정적 반사”는 Java에서 어떻게 작동합니까? (예 : Mockito 또는 Easyymock에서)
-
06-07-2019 - |
문제
저는 .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 메소드에 대한 호출 매개 변수로 통과 그리고 가치가 아닌가?
다른 팁
Java Mock 라이브러리는 일반적으로 다음과 같이 작동합니다.
모의를 만들 때 실제 프록시가 생성됩니다 (인터페이스 또는 하위 클래스에서) 인스턴스는 "레코딩 모드"에 있습니다. 이는 후속 호출이 기록되었음을 의미합니다 (메소드 이름, 매개 변수, 예상 예상). 레코딩 모드의 프록시는 실제로 통화를 기록하는 것 외에는 아무것도 아닙니다. 반사 당사자는 관련이 없습니다. 메타 데이터 발견 등이 없습니다. 물론 이러한 라이브러리는 몇 가지 트릭을 수행하지만 (예 : 스레드-로컬 변수에 보유를 저장하여 void를 반환하는 메소드를 처리 함) 아이디어는 동일하게 유지됩니다.
그런 다음 "재생 모드"가 시작되면 모의 인스턴스는 단순히 호출 목록 (메소드+매개 변수 및 리턴 값)에서 기대치를 확인합니다.
나는 Mockito 또는 Easyymock과 함께 일한 적이 없지만 전화가 당신이 생각하는 일을한다고 생각하지 않습니다. 그것은 해석되지 않습니다 mockedList.get(0)
특별한 방식으로. 방법 get
에서 실행됩니다 mockedList
대상은 정상적으로, 그리고 결과 그 중 하나는 다음과 같습니다 when
.
mockedList.get(0)
메소드 호출의 구문이며 정확히 수행합니다. 그 방법이하는 일은 정확히 명확하지 않습니다. mockedList
의 런타임 유형은 서브 클래스입니다 LinkedList
반환 mock
조롱 프레임 워크가 어떻게 적합한 지 구현할 수있는 방법.