package org.robolectric.internal.bytecode;
import org.junit.Test;
import org.robolectric.internal.bytecode.ProxyMaker;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class ProxyMakerTest {
private static final ProxyMaker.MethodMapper IDENTITY_NAME = new ProxyMaker.MethodMapper() {
@Override public String getName(String className, String methodName) {
return methodName;
}
};
@Test
public void proxyCall() {
ProxyMaker maker = new ProxyMaker(IDENTITY_NAME);
Thing mock = mock(Thing.class);
Thing proxy = maker.createProxyFactory(Thing.class).createProxy(Thing.class, mock);
assertThat(proxy.getClass()).isNotSameAs(Thing.class);
proxy.returnNothing();
verify(mock).returnNothing();
when(mock.returnInt()).thenReturn(42);
assertThat(proxy.returnInt()).isEqualTo(42);
verify(mock).returnInt();
proxy.argument("hello");
verify(mock).argument("hello");
}
@Test
public void cachesProxyClass() {
ProxyMaker maker = new ProxyMaker(IDENTITY_NAME);
Thing thing1 = mock(Thing.class);
Thing thing2 = mock(Thing.class);
Thing proxy1 = maker.createProxy(Thing.class, thing1);
Thing proxy2 = maker.createProxy(Thing.class, thing2);
assertThat(proxy1.getClass()).isSameAs(proxy2.getClass());
}
public class Thing {
public Thing() {
throw new UnsupportedOperationException();
}
public void returnNothing() {
throw new UnsupportedOperationException();
}
public int returnInt() {
throw new UnsupportedOperationException();
}
public void argument(String arg) {
throw new UnsupportedOperationException();
}
}
}