我是一个.NET人 - 我主要使用C#编写代码.
从C#3.0开始,我们可以利用lambda表达式和表达式树来使用静态反射.例如,可以GetMethodName
在以下代码段中实现返回参数中传递的方法的名称:
string methodName = GetMethodName( o => o.DoSomething()); Console.WriteLine(methodName); // displays "DoSomething"
现在,当我在Java世界中查看Mockito样本(或EasyMock样本)时,我看到:
LinkedList mockedList = mock(LinkedList.class); when(mockedList.get(0)).thenReturn("first");
它是如何工作的?
该when
方法如何工作?它mockedList.get(0)
是如何解释为对get方法的调用,0作为参数而不是作为值传递?
模拟库通常不使用表达式树.它们构建了一个实现适当接口的类型,并通过记录它们或验证它们并返回预编程的响应来响应方法调用.这通常使用代理(例如,.NET中的RealProxy,Java中的代理)或动态代码生成来完成.
在EasyMock的情况下,它使用Proxy
(对于接口,无论如何),正如您在源代码中看到的那样:看看org.easymock.internal.JavaProxyFactory
.