package net.bytebuddy.pool; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.test.utility.MockitoRule; import net.bytebuddy.test.utility.ObjectPropertyAssertion; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TestRule; import org.mockito.Mock; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.Mockito.*; public class TypePoolLazyFacadeTest { private static final String FOO = "foo"; private static final int MODIFIERS = 42; @Rule public TestRule mockitoRule = new MockitoRule(this); @Mock private TypePool typePool; @Mock private TypePool.Resolution resolution; @Mock private TypeDescription typeDescription; @Before public void setUp() throws Exception { when(typePool.describe(FOO)).thenReturn(resolution); when(resolution.isResolved()).thenReturn(true); when(resolution.resolve()).thenReturn(typeDescription); when(typeDescription.getModifiers()).thenReturn(MODIFIERS); } @Test public void testDoesNotQueryActualTypePoolForName() throws Exception { TypePool typePool = new TypePool.LazyFacade(this.typePool); assertThat(typePool.describe(FOO).resolve().getName(), is(FOO)); verifyZeroInteractions(this.typePool); } @Test public void testDoesQueryActualTypePoolForResolution() throws Exception { TypePool typePool = new TypePool.LazyFacade(this.typePool); assertThat(typePool.describe(FOO).isResolved(), is(true)); verify(this.typePool).describe(FOO); verifyNoMoreInteractions(this.typePool); verify(resolution).isResolved(); verifyNoMoreInteractions(resolution); } @Test public void testDoesQueryActualTypePoolForNonNameProperty() throws Exception { TypePool typePool = new TypePool.LazyFacade(this.typePool); assertThat(typePool.describe(FOO).resolve().getModifiers(), is(MODIFIERS)); verify(this.typePool).describe(FOO); verifyNoMoreInteractions(this.typePool); verify(resolution).resolve(); verifyNoMoreInteractions(resolution); verify(typeDescription).getModifiers(); verifyNoMoreInteractions(typeDescription); } @Test public void testObjectProperties() throws Exception { ObjectPropertyAssertion.of(TypePool.LazyFacade.class).apply(); ObjectPropertyAssertion.of(TypePool.LazyFacade.LazyResolution.class).apply(); } }