package net.bytebuddy.dynamic.scaffold; import net.bytebuddy.description.annotation.AnnotationValue; import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.modifier.Visibility; import net.bytebuddy.implementation.Implementation; import net.bytebuddy.implementation.attribute.MethodAttributeAppender; 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 org.objectweb.asm.ClassVisitor; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class MethodRegistryHandlerTest { @Rule public TestRule mockitoRule = new MockitoRule(this); @Mock private InstrumentedType instrumentedType, preparedInstrumentedType; @Mock private Implementation implementation; @Mock private AnnotationValue<?, ?> annotationValue; @Mock private Implementation.Target implementationTarget; @Mock private MethodAttributeAppender attributeAppender; @Mock private ClassVisitor classVisitor; @Mock private Implementation.Context implementationContext; @Mock private MethodDescription methodDescription; @Before public void setUp() throws Exception { when(implementation.prepare(instrumentedType)).thenReturn(preparedInstrumentedType); } @Test public void testHandlerForAbstractMethod() throws Exception { MethodRegistry.Handler handler = MethodRegistry.Handler.ForAbstractMethod.INSTANCE; assertThat(handler.prepare(instrumentedType), is(instrumentedType)); TypeWriter.MethodPool.Record record = handler.compile(implementationTarget).assemble(methodDescription, attributeAppender, Visibility.PUBLIC); assertThat(record.getSort(), is(TypeWriter.MethodPool.Record.Sort.DEFINED)); } @Test public void testHandlerForImplementation() throws Exception { MethodRegistry.Handler handler = new MethodRegistry.Handler.ForImplementation(implementation); assertThat(handler.prepare(instrumentedType), is(preparedInstrumentedType)); TypeWriter.MethodPool.Record record = handler.compile(implementationTarget).assemble(methodDescription, attributeAppender, Visibility.PUBLIC); assertThat(record.getSort(), is(TypeWriter.MethodPool.Record.Sort.IMPLEMENTED)); } @Test public void testHandlerForAnnotationValue() throws Exception { MethodRegistry.Handler handler = new MethodRegistry.Handler.ForAnnotationValue(annotationValue); assertThat(handler.prepare(instrumentedType), is(instrumentedType)); TypeWriter.MethodPool.Record record = handler.compile(implementationTarget).assemble(methodDescription, attributeAppender, Visibility.PUBLIC); assertThat(record.getSort(), is(TypeWriter.MethodPool.Record.Sort.DEFINED)); } @Test(expected = IllegalStateException.class) public void testVisibilityBridgeHandlerPreparationThrowsException() throws Exception { MethodRegistry.Handler.ForVisibilityBridge.INSTANCE.prepare(mock(InstrumentedType.class)); } @Test public void testObjectProperties() throws Exception { ObjectPropertyAssertion.of(MethodRegistry.Handler.ForAbstractMethod.class).apply(); ObjectPropertyAssertion.of(MethodRegistry.Handler.ForImplementation.class).apply(); ObjectPropertyAssertion.of(MethodRegistry.Handler.ForImplementation.Compiled.class).apply(); ObjectPropertyAssertion.of(MethodRegistry.Handler.ForAnnotationValue.class).apply(); ObjectPropertyAssertion.of(MethodRegistry.Handler.ForVisibilityBridge.class).apply(); ObjectPropertyAssertion.of(MethodRegistry.Handler.ForVisibilityBridge.Compiled.class).apply(); } }