package br.com.citframework.util; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import org.junit.Test; /** * Classe de testes para valida��o do comportamento de {@link ReflectionUtils} * * @author bruno.ribeiro - <a href="mailto:bruno.ribeiro@centrait.com.br">bruno.ribeiro@centrait.com.br</a> * @since 18/08/2014 * */ public final class ReflectionUtilsTest { @Test public void findField() { Field field = ReflectionUtils.findField(TestObjectSubclassWithPublicField.class, "publicField", String.class); assertNotNull(field); assertEquals("publicField", field.getName()); assertEquals(String.class, field.getType()); assertTrue("Field should be public.", Modifier.isPublic(field.getModifiers())); field = ReflectionUtils.findField(TestObjectSubclassWithNewField.class, "prot", String.class); assertNotNull(field); assertEquals("prot", field.getName()); assertEquals(String.class, field.getType()); assertTrue("Field should be protected.", Modifier.isProtected(field.getModifiers())); field = ReflectionUtils.findField(TestObjectSubclassWithNewField.class, "name", String.class); assertNotNull(field); assertEquals("name", field.getName()); assertEquals(String.class, field.getType()); assertTrue("Field should be private.", Modifier.isPrivate(field.getModifiers())); } @Test public void setField() { final TestObjectSubclassWithNewField testBean = new TestObjectSubclassWithNewField(); final Field field = ReflectionUtils.findField(TestObjectSubclassWithNewField.class, "name", String.class); ReflectionUtils.makeAccessible(field); ReflectionUtils.setField(field, testBean, "FooBar"); assertNotNull(testBean.getName()); assertEquals("FooBar", testBean.getName()); ReflectionUtils.setField(field, testBean, null); assertNull(testBean.getName()); } @Test(expected = IllegalStateException.class) public void setFieldIllegal() { final TestObjectSubclassWithNewField testBean = new TestObjectSubclassWithNewField(); final Field field = ReflectionUtils.findField(TestObjectSubclassWithNewField.class, "name", String.class); ReflectionUtils.setField(field, testBean, "FooBar"); } @Test public void invokeMethod() throws Exception { final String rob = "Rob Harrop"; final TestObject bean = new TestObject(); bean.setName(rob); final Method setName = TestObject.class.getMethod("setName", new Class[] {String.class}); final String juergen = "Juergen Hoeller"; ReflectionUtils.invokeMethod(setName, bean, new Object[] {juergen}); assertEquals("Incorrect name set", juergen, bean.getName()); } @Test public void findMethod() throws Exception { assertNotNull(ReflectionUtils.findMethod(B.class, "bar", String.class)); assertNotNull(ReflectionUtils.findMethod(B.class, "foo", Integer.class)); } @SuppressWarnings("unused") private static class TestObject { private String name; private Integer age; private TestObject spouse; public String getName() { return name; } public void setName(final String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(final Integer age) { this.age = age; } public TestObject getSpouse() { return spouse; } public void setSpouse(final TestObject spouse) { this.spouse = spouse; } } private static class TestObjectSubclassWithPublicField extends TestObject { @SuppressWarnings("unused") public String publicField = "foo"; } @SuppressWarnings("unused") private static class TestObjectSubclassWithNewField extends TestObject { private int magic; protected String prot = "foo"; } private static class A { @SuppressWarnings("unused") private void foo(final Integer i) {} } @SuppressWarnings("unused") private static class B extends A { void bar(final String s) throws IllegalArgumentException {} int add(final int... args) { int sum = 0; for (final int arg : args) { sum += arg; } return sum; } } }