Refactoring in the unit test utility framework:
* Moved unit test utilities to the onlab-junit package under utils/junit
- ImmutableClassChecker
- TestUtils and TestUtilsTest
* Added/ported unit test utilities from the older code
- UtilityClassChecker and UtilityClassCheckerTest
- ImmutableClassCheckerTest
* Updated/fixed some of the pom.xml files in the context of the
onlab-junit package:
- Added <scope>test</scope>
- Replaced hard-coded "1.0.0-SNAPSHOT" with "${project.version}"
Change-Id: Ie5f51ba401ca1748340f38848ab6bfc251964adc
diff --git a/utils/misc/pom.xml b/utils/misc/pom.xml
index d1d3a50..fcb0eb8 100644
--- a/utils/misc/pom.xml
+++ b/utils/misc/pom.xml
@@ -24,6 +24,7 @@
<dependency>
<groupId>org.onlab.onos</groupId>
<artifactId>onlab-junit</artifactId>
+ <scope>test</scope>
</dependency>
<dependency>
<groupId>io.netty</groupId>
diff --git a/utils/misc/src/main/java/org/onlab/util/TestUtils.java b/utils/misc/src/main/java/org/onlab/util/TestUtils.java
deleted file mode 100644
index 7e59564..0000000
--- a/utils/misc/src/main/java/org/onlab/util/TestUtils.java
+++ /dev/null
@@ -1,169 +0,0 @@
-package org.onlab.util;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-
-/**
- * Utilities for testing.
- */
-public final class TestUtils {
-
- /**
- * Sets the field, bypassing scope restriction.
- *
- * @param subject Object where the field belongs
- * @param fieldName name of the field to set
- * @param value value to set to the field.
- * @param <T> subject type
- * @param <U> value type
- * @throws TestUtilsException if there are reflection errors while setting
- * the field
- */
- public static <T, U> void setField(T subject, String fieldName, U value)
- throws TestUtilsException {
- @SuppressWarnings("unchecked")
- Class<T> clazz = (Class<T>) subject.getClass();
- try {
- Field field = clazz.getDeclaredField(fieldName);
- field.setAccessible(true);
- field.set(subject, value);
- } catch (NoSuchFieldException | SecurityException |
- IllegalArgumentException | IllegalAccessException e) {
- throw new TestUtilsException("setField failed", e);
- }
- }
-
- /**
- * Gets the field, bypassing scope restriction.
- *
- * @param subject Object where the field belongs
- * @param fieldName name of the field to get
- * @return value of the field.
- * @param <T> subject type
- * @param <U> field value type
- * @throws TestUtilsException if there are reflection errors while getting
- * the field
- */
- public static <T, U> U getField(T subject, String fieldName)
- throws TestUtilsException {
- try {
- @SuppressWarnings("unchecked")
- Class<T> clazz = (Class<T>) subject.getClass();
- Field field = clazz.getDeclaredField(fieldName);
- field.setAccessible(true);
-
- @SuppressWarnings("unchecked")
- U result = (U) field.get(subject);
- return result;
- } catch (NoSuchFieldException | SecurityException |
- IllegalArgumentException | IllegalAccessException e) {
- throw new TestUtilsException("getField failed", e);
- }
- }
-
- /**
- * Calls the method, bypassing scope restriction.
- *
- * @param subject Object where the method belongs
- * @param methodName name of the method to call
- * @param paramTypes formal parameter type array
- * @param args arguments
- * @return return value or null if void
- * @param <T> subject type
- * @param <U> return value type
- * @throws TestUtilsException if there are reflection errors while calling
- * the method
- */
- public static <T, U> U callMethod(T subject, String methodName,
- Class<?>[] paramTypes, Object...args) throws TestUtilsException {
-
- try {
- @SuppressWarnings("unchecked")
- Class<T> clazz = (Class<T>) subject.getClass();
- final Method method;
- if (paramTypes == null || paramTypes.length == 0) {
- method = clazz.getDeclaredMethod(methodName);
- } else {
- method = clazz.getDeclaredMethod(methodName, paramTypes);
- }
- method.setAccessible(true);
-
- @SuppressWarnings("unchecked")
- U result = (U) method.invoke(subject, args);
- return result;
- } catch (NoSuchMethodException | SecurityException |
- IllegalAccessException | IllegalArgumentException |
- InvocationTargetException e) {
- throw new TestUtilsException("callMethod failed", e);
- }
- }
-
- /**
- * Calls the method, bypassing scope restriction.
- *
- * @param subject Object where the method belongs
- * @param methodName name of the method to call
- * @param paramType formal parameter type
- * @param arg argument
- * @return return value or null if void
- * @param <T> subject type
- * @param <U> return value type
- * @throws TestUtilsException if there are reflection errors while calling
- * the method
- */
- public static <T, U> U callMethod(T subject, String methodName,
- Class<?> paramType, Object arg) throws TestUtilsException {
- return callMethod(subject, methodName, new Class<?>[]{paramType}, arg);
- }
-
- /**
- * Triggers an allocation of an object of type <T> and forces a call to
- * the private constructor.
- *
- * @param constructor Constructor to call
- * @param <T> type of the object to create
- * @return created object of type <T>
- * @throws TestUtilsException if there are reflection errors while calling
- * the constructor
- */
- public static <T> T callConstructor(Constructor<T> constructor)
- throws TestUtilsException {
- try {
- constructor.setAccessible(true);
- return constructor.newInstance();
- } catch (InstantiationException | IllegalAccessException |
- InvocationTargetException error) {
- throw new TestUtilsException("callConstructor failed", error);
- }
- }
-
- /**
- * Avoid instantiation.
- */
- private TestUtils() {}
-
- /**
- * Exception that can be thrown if problems are encountered while executing
- * the utility method. These are usually problems accessing fields/methods
- * through reflection. The original exception can be found by examining the
- * cause.
- */
- public static class TestUtilsException extends Exception {
-
- private static final long serialVersionUID = 1L;
-
- /**
- * Constructs a new exception with the specified detail message and
- * cause.
- *
- * @param message the detail message
- * @param cause the original cause of this exception
- */
- public TestUtilsException(String message, Throwable cause) {
- super(message, cause);
- }
- }
-}
diff --git a/utils/misc/src/test/java/org/onlab/util/TestUtilsTest.java b/utils/misc/src/test/java/org/onlab/util/TestUtilsTest.java
deleted file mode 100644
index 58e60c1..0000000
--- a/utils/misc/src/test/java/org/onlab/util/TestUtilsTest.java
+++ /dev/null
@@ -1,170 +0,0 @@
-package org.onlab.util;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.onlab.util.TestUtils.TestUtilsException;
-
-/**
- * Test and usage examples for TestUtils.
- */
-public class TestUtilsTest {
-
- /**
- * Test data.
- */
- private static final class TestClass {
-
- @SuppressWarnings("unused")
- private int privateField = 42;
-
- @SuppressWarnings("unused")
- protected int protectedField = 2501; // CHECKSTYLE IGNORE THIS LINE
-
- /**
- * Protected method with multiple argument.
- *
- * @param x simply returns
- * @param y not used
- * @return x
- */
- @SuppressWarnings("unused")
- private int privateMethod(Number x, Long y) {
- return x.intValue();
- }
-
- /**
- * Protected method with no argument.
- *
- * @return int
- */
- @SuppressWarnings("unused")
- protected int protectedMethod() {
- return 42;
- }
-
- /**
- * Method returning array.
- *
- * @param ary random array
- * @return ary
- */
- @SuppressWarnings("unused")
- private int[] arrayReturnMethod(int[] ary) {
- return ary;
- }
-
- /**
- * Method without return value.
- *
- * @param s ignored
- */
- @SuppressWarnings("unused")
- private void voidMethod(String s) {
- System.out.println(s);
- }
- }
-
- private TestClass test;
-
- /**
- * Sets up the test fixture.
- */
- @Before
- public void setUp() {
- test = new TestClass();
- }
-
- /**
- * Example to access private field.
- *
- * @throws TestUtilsException TestUtils error
- */
- @Test
- public void testSetGetPrivateField() throws TestUtilsException {
-
- assertEquals(42, TestUtils.getField(test, "privateField"));
- TestUtils.setField(test, "privateField", 0xDEAD);
- assertEquals(0xDEAD, TestUtils.getField(test, "privateField"));
- }
-
- /**
- * Example to access protected field.
- *
- * @throws TestUtilsException TestUtils error
- */
- @Test
- public void testSetGetProtectedField() throws TestUtilsException {
-
- assertEquals(2501, TestUtils.getField(test, "protectedField"));
- TestUtils.setField(test, "protectedField", 0xBEEF);
- assertEquals(0xBEEF, TestUtils.getField(test, "protectedField"));
- }
-
- /**
- * Example to call private method and multiple parameters.
- * <p/>
- * It also illustrates that paramTypes must match declared type,
- * not the runtime types of arguments.
- *
- * @throws TestUtilsException TestUtils error
- */
- @Test
- public void testCallPrivateMethod() throws TestUtilsException {
-
- int result = TestUtils.callMethod(test, "privateMethod",
- new Class<?>[] {Number.class, Long.class},
- Long.valueOf(42), Long.valueOf(32));
- assertEquals(42, result);
- }
-
- /**
- * Example to call protected method and no parameters.
- *
- * @throws TestUtilsException TestUtils error
- */
- @Test
- public void testCallProtectedMethod() throws TestUtilsException {
-
- int result = TestUtils.callMethod(test, "protectedMethod",
- new Class<?>[] {});
- assertEquals(42, result);
- }
-
- /**
- * Example to call method returning array.
- * <p/>
- * Note: It is not required to receive as Object.
- * Following is just verifying it is not Boxed arrays.
- *
- * @throws TestUtilsException TestUtils error
- */
- @Test
- public void testCallArrayReturnMethod() throws TestUtilsException {
-
- int[] array = {1, 2, 3};
- Object aryResult = TestUtils.callMethod(test, "arrayReturnMethod",
- new Class<?>[] {int[].class}, array);
- assertEquals(int[].class, aryResult.getClass());
- assertArrayEquals(array, (int[]) aryResult);
- }
-
-
- /**
- * Example to call void returning method.
- * <p/>
- * Note: Return value will be null for void methods.
- *
- * @throws TestUtilsException TestUtils error
- */
- @Test
- public void testCallVoidReturnMethod() throws TestUtilsException {
-
- Object voidResult = TestUtils.callMethod(test, "voidMethod",
- String.class, "foobar");
- assertNull(voidResult);
- }
-}