diff --git a/org.springframework.test/src/main/java/org/springframework/test/util/ReflectionTestUtils.java b/org.springframework.test/src/main/java/org/springframework/test/util/ReflectionTestUtils.java index f7f83df309..d46a7ca37f 100644 --- a/org.springframework.test/src/main/java/org/springframework/test/util/ReflectionTestUtils.java +++ b/org.springframework.test/src/main/java/org/springframework/test/util/ReflectionTestUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2009 the original author or authors. + * Copyright 2002-2011 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,28 +22,32 @@ import java.lang.reflect.Method; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.util.Assert; +import org.springframework.util.MethodInvoker; +import org.springframework.util.ObjectUtils; import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; /** - *

- * ReflectionTestUtils is a collection of reflection-based utility methods for - * use in unit and integration testing scenarios. - *

- *

- * There are often situations in which it would be beneficial to be able to set - * a non-public field or invoke a non-public setter - * method when testing code involving, for example: - *

+ * {@code ReflectionTestUtils} is a collection of reflection-based utility + * methods for use in unit and integration testing scenarios. + * + *

There are often times when it would be beneficial to be able to set a + * non-{@code public} field, invoke a non-{@code public} setter method, or + * invoke a non-{@code public} configuration or lifecycle + * callback method when testing code involving, for example: + * *

* * @author Sam Brannen @@ -61,14 +65,13 @@ public class ReflectionTestUtils { /** - * Set the {@link Field field} with the given name on the - * provided {@link Object target object} to the supplied value. - *

- * This method traverses the class hierarchy in search of the desired field. - * In addition, an attempt will be made to make non-public - * fields accessible, thus allowing one to set - * protected, private, and - * package-private fields. + * Set the {@link Field field} with the given {@code name} on the provided + * {@link Object target object} to the supplied {@code value}. + * + *

This method traverses the class hierarchy in search of the desired field. + * In addition, an attempt will be made to make non-{@code public} fields + * accessible, thus allowing one to set {@code protected}, + * {@code private}, and package-private fields. * * @param target the target object on which to set the field * @param name the name of the field to set @@ -82,19 +85,18 @@ public class ReflectionTestUtils { } /** - * Set the {@link Field field} with the given name on the - * provided {@link Object target object} to the supplied value. - *

- * This method traverses the class hierarchy in search of the desired field. - * In addition, an attempt will be made to make non-public - * fields accessible, thus allowing one to set - * protected, private, and - * package-private fields. + * Set the {@link Field field} with the given {@code name} on the provided + * {@link Object target object} to the supplied {@code value}. + * + *

This method traverses the class hierarchy in search of the desired + * field. In addition, an attempt will be made to make non-{@code public} + * fields accessible, thus allowing one to set {@code protected}, + * {@code private}, and package-private fields. * * @param target the target object on which to set the field * @param name the name of the field to set * @param value the value to set - * @param type the type of the field (may be null) + * @param type the type of the field (may be {@code null}) * @see ReflectionUtils#findField(Class, String, Class) * @see ReflectionUtils#makeAccessible(Field) * @see ReflectionUtils#setField(Field, Object, Object) @@ -102,9 +104,7 @@ public class ReflectionTestUtils { public static void setField(Object target, String name, Object value, Class type) { Assert.notNull(target, "Target object must not be null"); Field field = ReflectionUtils.findField(target.getClass(), name, type); - if (field == null) { - throw new IllegalArgumentException("Could not find field [" + name + "] on target [" + target + "]"); - } + Assert.notNull(field, "Could not find field [" + name + "] on target [" + target + "]"); if (logger.isDebugEnabled()) { logger.debug("Setting field [" + name + "] on target [" + target + "]"); @@ -114,14 +114,12 @@ public class ReflectionTestUtils { } /** - * Get the field with the given name from the provided target - * object. - *

- * This method traverses the class hierarchy in search of the desired field. - * In addition, an attempt will be made to make non-public - * fields accessible, thus allowing one to get - * protected, private, and - * package-private fields. + * Get the field with the given {@code name} from the provided target object. + * + *

This method traverses the class hierarchy in search of the desired + * field. In addition, an attempt will be made to make non-{@code public} + * fields accessible, thus allowing one to get {@code protected}, + * {@code private}, and package-private fields. * * @param target the target object on which to set the field * @param name the name of the field to get @@ -133,9 +131,7 @@ public class ReflectionTestUtils { public static Object getField(Object target, String name) { Assert.notNull(target, "Target object must not be null"); Field field = ReflectionUtils.findField(target.getClass(), name); - if (field == null) { - throw new IllegalArgumentException("Could not find field [" + name + "] on target [" + target + "]"); - } + Assert.notNull(field, "Could not find field [" + name + "] on target [" + target + "]"); if (logger.isDebugEnabled()) { logger.debug("Getting field [" + name + "] from target [" + target + "]"); @@ -145,17 +141,16 @@ public class ReflectionTestUtils { } /** - * Invoke the setter method with the given name on the supplied - * target object with the supplied value. - *

- * This method traverses the class hierarchy in search of the desired - * method. In addition, an attempt will be made to make non- - * public methods accessible, thus allowing one to - * invoke protected, private, and - * package-private setter methods. - *

- * In addition, this method supports JavaBean-style property names. - * For example, if you wish to set the name property on the + * Invoke the setter method with the given {@code name} on the supplied + * target object with the supplied {@code value}. + * + *

This method traverses the class hierarchy in search of the desired + * method. In addition, an attempt will be made to make non-{@code public} + * methods accessible, thus allowing one to invoke {@code protected}, + * {@code private}, and package-private setter methods. + * + *

In addition, this method supports JavaBean-style property + * names. For example, if you wish to set the {@code name} property on the * target object, you may pass either "name" or * "setName" as the method name. * @@ -173,17 +168,16 @@ public class ReflectionTestUtils { } /** - * Invoke the setter method with the given name on the supplied - * target object with the supplied value. - *

- * This method traverses the class hierarchy in search of the desired - * method. In addition, an attempt will be made to make non- - * public methods accessible, thus allowing one to - * invoke protected, private, and - * package-private setter methods. - *

- * In addition, this method supports JavaBean-style property names. - * For example, if you wish to set the name property on the + * Invoke the setter method with the given {@code name} on the supplied + * target object with the supplied {@code value}. + * + *

This method traverses the class hierarchy in search of the desired + * method. In addition, an attempt will be made to make non-{@code public} + * methods accessible, thus allowing one to invoke {@code protected}, + * {@code private}, and package-private setter methods. + * + *

In addition, this method supports JavaBean-style property + * names. For example, if you wish to set the {@code name} property on the * target object, you may pass either "name" or * "setName" as the method name. * @@ -199,7 +193,7 @@ public class ReflectionTestUtils { */ public static void invokeSetterMethod(Object target, String name, Object value, Class type) { Assert.notNull(target, "Target object must not be null"); - Assert.notNull(name, "Method name must not be empty"); + Assert.hasText(name, "Method name must not be empty"); Class[] paramTypes = (type != null ? new Class[] { type } : null); String setterMethodName = name; @@ -211,10 +205,8 @@ public class ReflectionTestUtils { setterMethodName = name; method = ReflectionUtils.findMethod(target.getClass(), setterMethodName, paramTypes); } - if (method == null) { - throw new IllegalArgumentException("Could not find setter method [" + setterMethodName + "] on target [" - + target + "] with parameter type [" + type + "]"); - } + Assert.notNull(method, "Could not find setter method [" + setterMethodName + "] on target [" + target + + "] with parameter type [" + type + "]"); if (logger.isDebugEnabled()) { logger.debug("Invoking setter method [" + setterMethodName + "] on target [" + target + "]"); @@ -224,17 +216,16 @@ public class ReflectionTestUtils { } /** - * Invoke the getter method with the given name on the supplied - * target object with the supplied value. - *

- * This method traverses the class hierarchy in search of the desired - * method. In addition, an attempt will be made to make non- - * public methods accessible, thus allowing one to - * invoke protected, private, and - * package-private getter methods. - *

- * In addition, this method supports JavaBean-style property names. - * For example, if you wish to get the name property on the + * Invoke the getter method with the given {@code name} on the supplied + * target object with the supplied {@code value}. + * + *

This method traverses the class hierarchy in search of the desired + * method. In addition, an attempt will be made to make non-{@code public} + * methods accessible, thus allowing one to invoke {@code protected}, + * {@code private}, and package-private getter methods. + * + *

In addition, this method supports JavaBean-style property + * names. For example, if you wish to get the {@code name} property on the * target object, you may pass either "name" or * "getName" as the method name. * @@ -249,7 +240,7 @@ public class ReflectionTestUtils { */ public static Object invokeGetterMethod(Object target, String name) { Assert.notNull(target, "Target object must not be null"); - Assert.notNull(name, "Method name must not be empty"); + Assert.hasText(name, "Method name must not be empty"); String getterMethodName = name; if (!name.startsWith(GETTER_PREFIX)) { @@ -260,10 +251,7 @@ public class ReflectionTestUtils { getterMethodName = name; method = ReflectionUtils.findMethod(target.getClass(), getterMethodName); } - if (method == null) { - throw new IllegalArgumentException("Could not find getter method [" + getterMethodName + "] on target [" - + target + "]"); - } + Assert.notNull(method, "Could not find getter method [" + getterMethodName + "] on target [" + target + "]"); if (logger.isDebugEnabled()) { logger.debug("Invoking getter method [" + getterMethodName + "] on target [" + target + "]"); @@ -272,4 +260,48 @@ public class ReflectionTestUtils { return ReflectionUtils.invokeMethod(method, target); } + /** + * Invoke the method with the given {@code name} on the supplied target + * object with the supplied arguments. + * + *

This method traverses the class hierarchy in search of the desired + * method. In addition, an attempt will be made to make non-{@code public} + * methods accessible, thus allowing one to invoke {@code protected}, + * {@code private}, and package-private methods. + * + * @param target the target object on which to invoke the specified method + * @param name the name of the method to invoke + * @param args the arguments to provide to the method + * @return the invocation result, if any + * @see MethodInvoker + * @see ReflectionUtils#makeAccessible(Method) + * @see ReflectionUtils#invokeMethod(Method, Object, Object[]) + * @see ReflectionUtils#handleReflectionException(Exception) + */ + @SuppressWarnings("unchecked") + public static T invokeMethod(Object target, String name, Object... args) { + Assert.notNull(target, "Target object must not be null"); + Assert.hasText(name, "Method name must not be empty"); + + try { + MethodInvoker methodInvoker = new MethodInvoker(); + methodInvoker.setTargetObject(target); + methodInvoker.setTargetMethod(name); + methodInvoker.setArguments(args); + methodInvoker.prepare(); + + if (logger.isDebugEnabled()) { + logger.debug("Invoking method [" + name + "] on target [" + target + "] with arguments [" + + ObjectUtils.nullSafeToString(args) + "]"); + } + + return (T) methodInvoker.invoke(); + } + catch (Exception e) { + ReflectionUtils.handleReflectionException(e); + } + + throw new IllegalStateException("Should never get here"); + } + } diff --git a/org.springframework.test/src/test/java/org/springframework/test/util/ReflectionTestUtilsTests.java b/org.springframework.test/src/test/java/org/springframework/test/util/ReflectionTestUtilsTests.java index 58c0ce45e1..e98018d0fa 100644 --- a/org.springframework.test/src/test/java/org/springframework/test/util/ReflectionTestUtilsTests.java +++ b/org.springframework.test/src/test/java/org/springframework/test/util/ReflectionTestUtilsTests.java @@ -16,69 +16,80 @@ package org.springframework.test.util; -import junit.framework.TestCase; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.springframework.test.util.ReflectionTestUtils.getField; +import static org.springframework.test.util.ReflectionTestUtils.invokeGetterMethod; +import static org.springframework.test.util.ReflectionTestUtils.invokeMethod; +import static org.springframework.test.util.ReflectionTestUtils.invokeSetterMethod; +import static org.springframework.test.util.ReflectionTestUtils.setField; +import org.junit.Test; import org.springframework.test.AssertThrows; +import org.springframework.test.util.subpackage.Component; import org.springframework.test.util.subpackage.Person; /** - * JUnit 3.8 based unit tests for {@link ReflectionTestUtils}. + * Unit tests for {@link ReflectionTestUtils}. * * @author Sam Brannen * @author Juergen Hoeller */ @SuppressWarnings("deprecation") -public class ReflectionTestUtilsTests extends TestCase { +public class ReflectionTestUtilsTests { - protected static final Float PI = new Float((float) 22 / 7); + private static final Float PI = new Float((float) 22 / 7); + + private final Person person = new Person(); + private final Component component = new Component(); - public void testSetField() throws Exception { - final Person person = new Person(); + @Test + public void setAndGetFields() throws Exception { + // --------------------------------------------------------------------- // Standard - ReflectionTestUtils.setField(person, "id", new Long(99), long.class); - ReflectionTestUtils.setField(person, "name", "Tom"); - ReflectionTestUtils.setField(person, "age", new Integer(42)); - ReflectionTestUtils.setField(person, "eyeColor", "blue", String.class); - ReflectionTestUtils.setField(person, "likesPets", Boolean.TRUE); - ReflectionTestUtils.setField(person, "favoriteNumber", PI, Number.class); + setField(person, "id", new Long(99), long.class); + setField(person, "name", "Tom"); + setField(person, "age", new Integer(42)); + setField(person, "eyeColor", "blue", String.class); + setField(person, "likesPets", Boolean.TRUE); + setField(person, "favoriteNumber", PI, Number.class); - assertEquals("Verifying that the person's ID (private field in a superclass) was set.", 99, person.getId()); - assertEquals("Verifying that the person's name (protected field) was set.", "Tom", person.getName()); - assertEquals("Verifying that the person's age (private field) was set.", 42, person.getAge()); - assertEquals("Verifying that the person's eye color (package private field) was set.", "blue", - person.getEyeColor()); - assertEquals("Verifying that the person's 'likes pets' flag (package private boolean field) was set.", true, - person.likesPets()); - assertEquals("Verifying that the person's 'favorite number' (package field) was set.", PI, - person.getFavoriteNumber()); + assertEquals("ID (private field in a superclass)", 99, person.getId()); + assertEquals("name (protected field)", "Tom", person.getName()); + assertEquals("age (private field)", 42, person.getAge()); + assertEquals("eye color (package private field)", "blue", person.getEyeColor()); + assertEquals("'likes pets' flag (package private boolean field)", true, person.likesPets()); + assertEquals("'favorite number' (package field)", PI, person.getFavoriteNumber()); - assertEquals(new Long(99), ReflectionTestUtils.getField(person, "id")); - assertEquals("Tom", ReflectionTestUtils.getField(person, "name")); - assertEquals(new Integer(42), ReflectionTestUtils.getField(person, "age")); - assertEquals("blue", ReflectionTestUtils.getField(person, "eyeColor")); - assertEquals(Boolean.TRUE, ReflectionTestUtils.getField(person, "likesPets")); - assertEquals(PI, ReflectionTestUtils.getField(person, "favoriteNumber")); + assertEquals(new Long(99), getField(person, "id")); + assertEquals("Tom", getField(person, "name")); + assertEquals(new Integer(42), getField(person, "age")); + assertEquals("blue", getField(person, "eyeColor")); + assertEquals(Boolean.TRUE, getField(person, "likesPets")); + assertEquals(PI, getField(person, "favoriteNumber")); + // --------------------------------------------------------------------- // Null - non-primitives - ReflectionTestUtils.setField(person, "name", null, String.class); - ReflectionTestUtils.setField(person, "eyeColor", null, String.class); - ReflectionTestUtils.setField(person, "favoriteNumber", null, Number.class); + setField(person, "name", null, String.class); + setField(person, "eyeColor", null, String.class); + setField(person, "favoriteNumber", null, Number.class); - assertNull("Verifying that the person's name (protected field) was set.", person.getName()); - assertNull("Verifying that the person's eye color (package private field) was set.", person.getEyeColor()); - assertNull("Verifying that the person's 'favorite number' (package field) was set.", person.getFavoriteNumber()); + assertNull("name (protected field)", person.getName()); + assertNull("eye color (package private field)", person.getEyeColor()); + assertNull("'favorite number' (package field)", person.getFavoriteNumber()); + // --------------------------------------------------------------------- // Null - primitives new AssertThrows(IllegalArgumentException.class, "Calling setField() with NULL for a primitive type should throw an IllegalArgumentException.") { public void test() throws Exception { - ReflectionTestUtils.setField(person, "id", null, long.class); + setField(person, "id", null, long.class); } }.runTest(); @@ -86,7 +97,7 @@ public class ReflectionTestUtilsTests extends TestCase { "Calling setField() with NULL for a primitive type should throw an IllegalArgumentException.") { public void test() throws Exception { - ReflectionTestUtils.setField(person, "age", null, int.class); + setField(person, "age", null, int.class); } }.runTest(); @@ -94,102 +105,145 @@ public class ReflectionTestUtilsTests extends TestCase { "Calling setField() with NULL for a primitive type should throw an IllegalArgumentException.") { public void test() throws Exception { - ReflectionTestUtils.setField(person, "likesPets", null, boolean.class); + setField(person, "likesPets", null, boolean.class); } }.runTest(); } - public void testInvokeSetterMethod() throws Exception { - final Person person = new Person(); + @Test + public void invokeSetterAndMethods() throws Exception { + // --------------------------------------------------------------------- // Standard - properties - ReflectionTestUtils.invokeSetterMethod(person, "id", new Long(99), long.class); - ReflectionTestUtils.invokeSetterMethod(person, "name", "Tom"); - ReflectionTestUtils.invokeSetterMethod(person, "age", new Integer(42)); - ReflectionTestUtils.invokeSetterMethod(person, "eyeColor", "blue", String.class); - ReflectionTestUtils.invokeSetterMethod(person, "likesPets", Boolean.TRUE); - ReflectionTestUtils.invokeSetterMethod(person, "favoriteNumber", PI, Number.class); + invokeSetterMethod(person, "id", new Long(99), long.class); + invokeSetterMethod(person, "name", "Tom"); + invokeSetterMethod(person, "age", new Integer(42)); + invokeSetterMethod(person, "eyeColor", "blue", String.class); + invokeSetterMethod(person, "likesPets", Boolean.TRUE); + invokeSetterMethod(person, "favoriteNumber", PI, Number.class); - assertEquals("Verifying that the person's ID (protected method in a superclass) was set.", 99, person.getId()); - assertEquals("Verifying that the person's name (private method) was set.", "Tom", person.getName()); - assertEquals("Verifying that the person's age (protected method) was set.", 42, person.getAge()); - assertEquals("Verifying that the person's eye color (package private method) was set.", "blue", - person.getEyeColor()); - assertEquals("Verifying that the person's 'likes pets' flag (protected method for a boolean) was set.", true, - person.likesPets()); - assertEquals("Verifying that the person's 'favorite number' (protected method for a Number) was set.", PI, - person.getFavoriteNumber()); + assertEquals("ID (protected method in a superclass)", 99, person.getId()); + assertEquals("name (private method)", "Tom", person.getName()); + assertEquals("age (protected method)", 42, person.getAge()); + assertEquals("eye color (package private method)", "blue", person.getEyeColor()); + assertEquals("'likes pets' flag (protected method for a boolean)", true, person.likesPets()); + assertEquals("'favorite number' (protected method for a Number)", PI, person.getFavoriteNumber()); - assertEquals(new Long(99), ReflectionTestUtils.invokeGetterMethod(person, "id")); - assertEquals("Tom", ReflectionTestUtils.invokeGetterMethod(person, "name")); - assertEquals(new Integer(42), ReflectionTestUtils.invokeGetterMethod(person, "age")); - assertEquals("blue", ReflectionTestUtils.invokeGetterMethod(person, "eyeColor")); - assertEquals(Boolean.TRUE, ReflectionTestUtils.invokeGetterMethod(person, "likesPets")); - assertEquals(PI, ReflectionTestUtils.invokeGetterMethod(person, "favoriteNumber")); + assertEquals(new Long(99), invokeGetterMethod(person, "id")); + assertEquals("Tom", invokeGetterMethod(person, "name")); + assertEquals(new Integer(42), invokeGetterMethod(person, "age")); + assertEquals("blue", invokeGetterMethod(person, "eyeColor")); + assertEquals(Boolean.TRUE, invokeGetterMethod(person, "likesPets")); + assertEquals(PI, invokeGetterMethod(person, "favoriteNumber")); + // --------------------------------------------------------------------- // Standard - setter methods - ReflectionTestUtils.invokeSetterMethod(person, "setId", new Long(1), long.class); - ReflectionTestUtils.invokeSetterMethod(person, "setName", "Jerry", String.class); - ReflectionTestUtils.invokeSetterMethod(person, "setAge", new Integer(33), int.class); - ReflectionTestUtils.invokeSetterMethod(person, "setEyeColor", "green", String.class); - ReflectionTestUtils.invokeSetterMethod(person, "setLikesPets", Boolean.FALSE, boolean.class); - ReflectionTestUtils.invokeSetterMethod(person, "setFavoriteNumber", new Integer(42), Number.class); + invokeSetterMethod(person, "setId", new Long(1), long.class); + invokeSetterMethod(person, "setName", "Jerry", String.class); + invokeSetterMethod(person, "setAge", new Integer(33), int.class); + invokeSetterMethod(person, "setEyeColor", "green", String.class); + invokeSetterMethod(person, "setLikesPets", Boolean.FALSE, boolean.class); + invokeSetterMethod(person, "setFavoriteNumber", new Integer(42), Number.class); - assertEquals("Verifying that the person's ID (protected method in a superclass) was set.", 1, person.getId()); - assertEquals("Verifying that the person's name (private method) was set.", "Jerry", person.getName()); - assertEquals("Verifying that the person's age (protected method) was set.", 33, person.getAge()); - assertEquals("Verifying that the person's eye color (package private method) was set.", "green", - person.getEyeColor()); - assertEquals("Verifying that the person's 'likes pets' flag (protected method for a boolean) was set.", false, - person.likesPets()); - assertEquals("Verifying that the person's 'favorite number' (protected method for a Number) was set.", - new Integer(42), person.getFavoriteNumber()); + assertEquals("ID (protected method in a superclass)", 1, person.getId()); + assertEquals("name (private method)", "Jerry", person.getName()); + assertEquals("age (protected method)", 33, person.getAge()); + assertEquals("eye color (package private method)", "green", person.getEyeColor()); + assertEquals("'likes pets' flag (protected method for a boolean)", false, person.likesPets()); + assertEquals("'favorite number' (protected method for a Number)", new Integer(42), person.getFavoriteNumber()); - assertEquals(new Long(1), ReflectionTestUtils.invokeGetterMethod(person, "getId")); - assertEquals("Jerry", ReflectionTestUtils.invokeGetterMethod(person, "getName")); - assertEquals(new Integer(33), ReflectionTestUtils.invokeGetterMethod(person, "getAge")); - assertEquals("green", ReflectionTestUtils.invokeGetterMethod(person, "getEyeColor")); - assertEquals(Boolean.FALSE, ReflectionTestUtils.invokeGetterMethod(person, "likesPets")); - assertEquals(new Integer(42), ReflectionTestUtils.invokeGetterMethod(person, "getFavoriteNumber")); + assertEquals(new Long(1), invokeGetterMethod(person, "getId")); + assertEquals("Jerry", invokeGetterMethod(person, "getName")); + assertEquals(new Integer(33), invokeGetterMethod(person, "getAge")); + assertEquals("green", invokeGetterMethod(person, "getEyeColor")); + assertEquals(Boolean.FALSE, invokeGetterMethod(person, "likesPets")); + assertEquals(new Integer(42), invokeGetterMethod(person, "getFavoriteNumber")); + // --------------------------------------------------------------------- // Null - non-primitives - ReflectionTestUtils.invokeSetterMethod(person, "name", null, String.class); - ReflectionTestUtils.invokeSetterMethod(person, "eyeColor", null, String.class); - ReflectionTestUtils.invokeSetterMethod(person, "favoriteNumber", null, Number.class); + invokeSetterMethod(person, "name", null, String.class); + invokeSetterMethod(person, "eyeColor", null, String.class); + invokeSetterMethod(person, "favoriteNumber", null, Number.class); - assertNull("Verifying that the person's name (private method) was set.", person.getName()); - assertNull("Verifying that the person's eye color (package private method) was set.", person.getEyeColor()); - assertNull("Verifying that the person's 'favorite number' (protected method for a Number) was set.", - person.getFavoriteNumber()); + assertNull("name (private method)", person.getName()); + assertNull("eye color (package private method)", person.getEyeColor()); + assertNull("'favorite number' (protected method for a Number)", person.getFavoriteNumber()); + // --------------------------------------------------------------------- // Null - primitives - new AssertThrows(RuntimeException.class, + new AssertThrows(IllegalArgumentException.class, "Calling invokeSetterMethod() with NULL for a primitive type should throw an IllegalArgumentException.") { public void test() throws Exception { - ReflectionTestUtils.invokeSetterMethod(person, "id", null, long.class); + invokeSetterMethod(person, "id", null, long.class); } }.runTest(); - new AssertThrows(RuntimeException.class, + new AssertThrows(IllegalArgumentException.class, "Calling invokeSetterMethod() with NULL for a primitive type should throw an IllegalArgumentException.") { public void test() throws Exception { - ReflectionTestUtils.invokeSetterMethod(person, "age", null, int.class); + invokeSetterMethod(person, "age", null, int.class); } }.runTest(); - new AssertThrows(RuntimeException.class, + new AssertThrows(IllegalArgumentException.class, "Calling invokeSetterMethod() with NULL for a primitive type should throw an IllegalArgumentException.") { public void test() throws Exception { - ReflectionTestUtils.invokeSetterMethod(person, "likesPets", null, boolean.class); + invokeSetterMethod(person, "likesPets", null, boolean.class); } }.runTest(); } + @Test + public void invokeMethodWithReturnValueWithAutoboxingAndUnboxing() { + int sum = invokeMethod(component, "add", 1, 2); + assertEquals("add(1, 2)", 3, sum); + } + + @Test + public void invokeMethodsSimulatingLifecycleEvents() { + assertNull("number", component.getNumber()); + assertNull("text", component.getText()); + + // Simulate autowiring a configuration method + invokeMethod(component, "configure", new Integer(42), "enigma"); + assertEquals("number should have been configured", new Integer(42), component.getNumber()); + assertEquals("text should have been configured", "enigma", component.getText()); + + // Simulate @PostConstruct life-cycle event + invokeMethod(component, "init"); + // assertions in init() should succeed + + // Simulate @PreDestroy life-cycle event + invokeMethod(component, "destroy"); + assertNull("number", component.getNumber()); + assertNull("text", component.getText()); + } + + @Test(expected = IllegalStateException.class) + public void invokeMethodWithIncompatibleArgumentTypes() { + invokeMethod(component, "add", "foo", 2.0); + } + + @Test(expected = IllegalStateException.class) + public void invokeInitMethodBeforeAutowiring() { + invokeMethod(component, "init"); + } + + @Test(expected = IllegalStateException.class) + public void invokeMethodWithTooFewArguments() { + invokeMethod(component, "configure", new Integer(42)); + } + + @Test(expected = IllegalStateException.class) + public void invokeMethodWithTooManyArguments() { + invokeMethod(component, "configure", new Integer(42), "enigma", "baz", "quux"); + } + } diff --git a/org.springframework.test/src/test/java/org/springframework/test/util/subpackage/Component.java b/org.springframework.test/src/test/java/org/springframework/test/util/subpackage/Component.java new file mode 100644 index 0000000000..64ecff8e0c --- /dev/null +++ b/org.springframework.test/src/test/java/org/springframework/test/util/subpackage/Component.java @@ -0,0 +1,69 @@ +/* + * Copyright 2002-2011 the original author or authors. + * + * 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 org.springframework.test.util.subpackage; + +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; + +/** + * Simple POJO representing a component; intended for use in + * unit tests. + * + * @author Sam Brannen + * @since 3.1 + */ +public class Component { + + private Integer number; + private String text; + + + public Integer getNumber() { + return this.number; + } + + public String getText() { + return this.text; + } + + @Autowired + protected void configure(Integer number, String text) { + this.number = number; + this.text = text; + } + + @PostConstruct + protected void init() { + Assert.state(number != null, "number must not be null"); + Assert.state(StringUtils.hasText(text), "text must not be empty"); + } + + @PreDestroy + protected void destroy() { + this.number = null; + this.text = null; + } + + int add(int a, int b) { + return a + b; + } + +} diff --git a/org.springframework.test/src/test/java/org/springframework/test/util/subpackage/PersistentEntity.java b/org.springframework.test/src/test/java/org/springframework/test/util/subpackage/PersistentEntity.java index 7831653bf3..3ff3d91dfd 100644 --- a/org.springframework.test/src/test/java/org/springframework/test/util/subpackage/PersistentEntity.java +++ b/org.springframework.test/src/test/java/org/springframework/test/util/subpackage/PersistentEntity.java @@ -1,5 +1,5 @@ /* - * Copyright 2007 the original author or authors. + * Copyright 2007-2011 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License.