2009-03-09 3 views
5

저는 .NET 사용자이고 주로 C#을 코딩합니다."정적 반사"는 Java에서 어떻게 작동합니까? (예 : mockito 또는 easymock)

C# 3.0부터 람다 식과 표현식 트리를 활용하여 static reflection을 사용할 수 있습니다. 난 자바 세계에서 Mockito 샘플 (또는 EasyMock에 것들)를 볼 때, 이제

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

: 예를 들어, 매개 변수에 전달 된 메소드의 이름을 반환하려면 다음 코드에서 GetMethodName을 구현할 수 참조 :

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

어떻게 작동합니까?

when 방법은 어떻게 작동합니까? 어떻게 mockedList.get(0)으로 해석합니까? 0으로 시작하는 get 메소드를 호출하는 것은 값이 아닌 매개 변수로 전달됩니까?

답변

5

조롱 라이브러리는 일반적으로 표현 트리와 함께 작동하지 않습니다. 적절한 인터페이스를 구현하고 메서드 호출에 응답하거나 해당 메서드를 확인하고 미리 프로그래밍 된 응답을 반환하여 형식에 응답합니다. 대개 프록시 (예 : .NET의 경우 RealProxy, Java의 경우 Proxy) 또는 동적 코드 생성으로 수행됩니다.

EasyMock의 경우 소스 코드에서 볼 수 있듯이 으로 보시면 EasyMock의 경우 Proxy (인터페이스 용)이 사용됩니다.

+0

프록시가 작동하는 인터페이스. 자신의 코드 생성에 대한 실제 조롱 프레임 워크. –

+0

.NET에서 강력한 형식의 조롱 프레임 워크는 표현 트리 (cf. Moq & Rhino mock)와 실제로 동적 프록시를 사용합니다. 하지만 여기서도 (프록시를 사용하는 경우에도) 어떻게 모의 설치를 안전하게 할 수 있는지는 여전히 내게 불분명하다. "(mockedList.get (0) + mockedList.get (2)). then return (42)"라고 입력하면 어떻게 될까요? –

+0

Rhino 모의는 표현 트리가 존재하기 오래 전에 존재했습니다. 어떤 경우에는 표현 트리 * now *를 사용할 수 있지만 항상 * 그렇게하지는 않습니다. (여전히 .NET 2.0에서 작동합니다.) 마지막 모의 결과를 지정하기 전에 모의 객체를 다시 호출하면 결과는 모의 객체의 모드에 따라 달라집니다. –

2

나는 결코 모키 토나 easymock으로 일한 적이 없지만 전화가 당신이 생각하는대로하지는 않는다고 생각합니다. 특별한 방법으로 mockedList.get(0)을 해석하지 않습니다. get 메서드는 mockedList 개체에서 정상적으로 실행되고 결과는when으로 전달됩니다.

1

mockedList.get(0)은 메소드 호출을위한 구문이며 정확하게 적용됩니다. 그 방법이하는 것이 정확히 명확하지 않습니다. mockedList의 런타임 유형은 mock 메서드에 의해 반환 된 LinkedList의 하위 클래스가되며 조롱 프레임 워크가 얼마나 적합한 지 구현할 수 있습니다.

4

자바 모의 라이브러리는 일반적으로 다음과 같이 작동합니다 : 당신이 가짜를 만들 때

, 실제 프록시 인스턴스는 "녹화 모드"에 (인터페이스 또는 하위 클래스에서 수)가 생성됩니다. 이것은 모든 후속 호출이 기록됨을 의미합니다 (메소드 이름, 매개 변수, 반환 예상). 녹음 모드의 프록시는 실제로 아무것도 기록하지 않지만 호출을 기록합니다. 반사 자체가 관여하지 않습니다. 메타 데이터 발견 등은 없습니다. 물론이 라이브러리는 void를 반환하는 메소드를 처리하기 위해 스레드 로컬 변수에 호출을 저장하는 것과 같은 몇 가지 트릭을 수행하지만 아이디어는 동일하게 유지됩니다.

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

관련 문제