package com.vladmihalcea.flexypool.util;
import com.vladmihalcea.flexypool.exception.ReflectionException;
import org.junit.Test;
import java.lang.reflect.InvocationTargetException;
import static org.junit.Assert.*;
/**
* ReflectionUtilsTest - ReflectionUtils Test
*
* @author Vlad Mihalcea
*/
public class ReflectionUtilsTest extends AbstractUtilsTest<ReflectionUtils> {
@Test
public void testGetFieldValue() {
TestObject testObject = new TestObject();
assertEquals("testObject", ReflectionUtils.getFieldValue(testObject, "name"));
assertEquals(1, ((Number) ReflectionUtils.getFieldValue(testObject, "version")).intValue());
}
@Test(expected = ReflectionException.class)
public void testGetFieldValueThrowsReflectionException() {
ReflectionUtils.getFieldValue(new TestObject(), "unknown");
}
@Test
public void testSetFieldValue() {
TestObject testObject = new TestObject();
assertEquals("testObject", ReflectionUtils.getFieldValue(testObject, "name"));
ReflectionUtils.setFieldValue(testObject, "name", "testObjectNameChanged");
assertEquals("testObjectNameChanged", ReflectionUtils.getFieldValue(testObject, "name"));
ReflectionUtils.setFieldValue(testObject, "name", null);
assertEquals(null, ReflectionUtils.getFieldValue(testObject, "name"));
}
@Test(expected = ReflectionException.class)
public void testSetFieldValueThrowsReflectionException() {
ReflectionUtils.setFieldValue(new TestObject(), "unknown", "value");
}
@Test
public void testGetMethod() {
assertNotNull(ReflectionUtils.getMethod(new TestObject(), "getName"));
}
@Test(expected = ReflectionException.class)
public void testGetMethodThrowsReflectionException() {
ReflectionUtils.getMethod(new TestObject(), "unknown");
}
@Test
public void testHasMethod() {
assertTrue(ReflectionUtils.hasMethod(TestObject.class, "getName"));
}
@Test
public void testHasMethodThrowsReflectionException() {
assertFalse(ReflectionUtils.hasMethod(TestObject.class, "unknown"));
}
@Test
public void testInvoke() {
TestObject testObject = new TestObject();
assertEquals("testObject", ReflectionUtils.invoke(testObject, ReflectionUtils.getMethod(testObject, "getName")));
ReflectionUtils.setFieldValue(testObject, "name", "testObjectNameChanged");
assertEquals("testObjectNameChanged", ReflectionUtils.invoke(testObject, ReflectionUtils.getMethod(testObject, "getName")));
assertNull(ReflectionUtils.invoke(testObject, ReflectionUtils.getMethod(testObject, "start")));
try {
ReflectionUtils.invoke(testObject, ReflectionUtils.getMethod(testObject, "setFails"));
fail("Should have failed!");
} catch (ReflectionException e) {
assertEquals(InvocationTargetException.class, e.getCause().getClass());
assertEquals(IllegalArgumentException.class, e.getCause().getCause().getClass());
}
}
@Test
public void testGetSetter() {
TestObject testObject = new TestObject();
try {
ReflectionUtils.getSetter(testObject, "name", String.class);
fail("There is no setName in TestObject");
} catch (ReflectionException expected) {
assertEquals(NoSuchMethodException.class, expected.getCause().getClass());
}
assertNotNull(ReflectionUtils.getSetter(testObject, "version", Integer.class));
try {
ReflectionUtils.invoke(testObject, ReflectionUtils.getMethod(testObject, "setFails"));
fail("Should have failed!");
} catch (ReflectionException e) {
assertEquals(InvocationTargetException.class, e.getCause().getClass());
assertEquals(IllegalArgumentException.class, e.getCause().getCause().getClass());
}
}
@Test
public void testInvokeSetter() {
TestObject testObject = new TestObject();
ReflectionUtils.invokeSetter(testObject, "version", 12);
assertEquals(12, ReflectionUtils.getFieldValue(testObject, "version"));
}
@Override
protected Class<ReflectionUtils> getUtilsClass() {
return ReflectionUtils.class;
}
}