/** * Copyright 2010-2016 Ralph Schaer <ralphschaer@gmail.com> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package ch.ralscha.extdirectspring.util; import static org.assertj.core.api.Assertions.assertThat; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import org.junit.Test; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.context.support.ClassPathXmlApplicationContext; import ch.ralscha.extdirectspring.annotation.ExtDirectMethod; import nl.jqno.equalsverifier.EqualsVerifier; public class MethodInfoCacheTest { @Test public void verifyEquals() { EqualsVerifier.forClass(MethodInfoCache.Key.class).verify(); } @Test @ExtDirectMethod public void testPutAndGet() throws SecurityException, NoSuchMethodException { MethodInfoCache methodInfoCache = new MethodInfoCache(); Method thisMethod = getClass().getMethod("testPutAndGet", (Class<?>[]) null); methodInfoCache.put("methodCacheTest", getClass(), thisMethod, null); assertThat(methodInfoCache.get("methodCacheTest", "testPu")).isNull(); assertThat(methodInfoCache.get("methodCacheTes", "testPut")).isNull(); assertThat(methodInfoCache.get("methodCacheTest", "testPutAndGet").getMethod()) .isEqualTo(thisMethod); } @Test public void testKey() { MethodInfoCache.Key key1 = new MethodInfoCache.Key("bean", "method"); MethodInfoCache.Key key2 = new MethodInfoCache.Key("bean", "otherMethod"); MethodInfoCache.Key key3 = new MethodInfoCache.Key("otherBean", "otherMethod"); assertThat(key1.equals(key1)).isTrue(); assertThat(key2.equals(key2)).isTrue(); assertThat(key3.equals(key3)).isTrue(); assertThat(key1.equals(key2)).isFalse(); assertThat(key1.equals(key3)).isFalse(); assertThat(key1.equals("test")).isFalse(); } @Test public void testFindMethodWithAnnotation() { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( "/testApplicationContextB.xml"); MethodInfoCache methodInfoCache = context.getBean(MethodInfoCache.class); MethodInfo methodBInfo = methodInfoCache.get("springManagedBean", "methodB"); Method methodBWithAnnotation = MethodInfo .findMethodWithAnnotation(methodBInfo.getMethod(), ExtDirectMethod.class); assertThat(methodBWithAnnotation).isEqualTo(methodBInfo.getMethod()); MethodInfo methodSubBInfo = methodInfoCache.get("springManagedSubBean", "methodB"); methodBWithAnnotation = MethodInfo.findMethodWithAnnotation( methodSubBInfo.getMethod(), ExtDirectMethod.class); assertThat(methodSubBInfo.getMethod().equals(methodBWithAnnotation)).isFalse(); assertThat(methodBInfo.getMethod().equals(methodBWithAnnotation)).isTrue(); context.close(); } @Test(expected = NullPointerException.class) public void testInvokeWithNull() throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext( "/testApplicationContextB.xml"); ExtDirectSpringUtil.invoke(null, null, null, null); classPathXmlApplicationContext.close(); } @Test(expected = NoSuchBeanDefinitionException.class) public void testNonExistingBeanAndMethod() throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( "/testApplicationContextB.xml"); MethodInfoCache methodInfoCache = context.getBean(MethodInfoCache.class); MethodInfo info = methodInfoCache.get("springManagedBeanA", "methodA"); ExtDirectSpringUtil.invoke(context, "springManagedBeanA", info, null); context.close(); } @Test(expected = NullPointerException.class) public void testExistingWithouEdsAnnotation() throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { MethodInfoCache methodInfoCache = new MethodInfoCache(); ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( "/testApplicationContextB.xml"); MethodInfo info = methodInfoCache.get("springManagedBean", "methodA"); ExtDirectSpringUtil.invoke(context, "springManagedBean", info, null); context.close(); } @Test public void testFindMethodAndInvoke() throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( "/testApplicationContextB.xml"); MethodInfoCache methodInfoCache = context.getBean(MethodInfoCache.class); MethodInfo infoB = methodInfoCache.get("springManagedBean", "methodB"); assertThat((Boolean) ExtDirectSpringUtil.invoke(context, "springManagedBean", infoB, null)).isFalse(); assertThat((Boolean) ExtDirectSpringUtil.invoke(context, "springManagedBean", infoB, null)).isFalse(); MethodInfo infoSum = methodInfoCache.get("springManagedBean", "sum"); assertThat(ExtDirectSpringUtil.invoke(context, "springManagedBean", infoSum, new Object[] { 1, 2 })).isEqualTo(Integer.valueOf(3)); assertThat(ExtDirectSpringUtil.invoke(context, "springManagedBean", infoSum, new Object[] { 6, 3 })).isEqualTo(Integer.valueOf(9)); assertThat(methodInfoCache.get("springManagedBean", "methodC")).isNull(); context.close(); } }