001: /*
002: * @(#)JUnitOrigCreator.java
003: *
004: * Copyright (C) 2002-2003 Matt Albrecht
005: * groboclown@users.sourceforge.net
006: * http://groboutils.sourceforge.net
007: *
008: * Permission is hereby granted, free of charge, to any person obtaining a
009: * copy of this software and associated documentation files (the "Software"),
010: * to deal in the Software without restriction, including without limitation
011: * the rights to use, copy, modify, merge, publish, distribute, sublicense,
012: * and/or sell copies of the Software, and to permit persons to whom the
013: * Software is furnished to do so, subject to the following conditions:
014: *
015: * The above copyright notice and this permission notice shall be included in
016: * all copies or substantial portions of the Software.
017: *
018: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
019: * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
020: * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
021: * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
022: * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
023: * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
024: * DEALINGS IN THE SOFTWARE.
025: */
026:
027: package net.sourceforge.groboutils.junit.v1.parser;
028:
029: import junit.framework.Test;
030:
031: import java.lang.reflect.Method;
032: import java.lang.reflect.InvocationTargetException;
033: import java.lang.reflect.Constructor;
034:
035: /**
036: * Emulates the construction mechanism for all JUnit versions.
037: *
038: * @author Matt Albrecht <a href="mailto:groboclown@users.sourceforge.net">groboclown@users.sourceforge.net</a>
039: * @version $Date: 2003/02/10 22:52:21 $
040: * @since November 3, 2002
041: */
042: public class JUnitOrigCreator implements ITestCreator {
043: /**
044: * Creates a new test, based on the given class and method of the class.
045: * This calls <tt>createTest( Class, Object[] )</tt> to create the new
046: * class, which itself calls <tt>getConstructorArgTypes( Class )</tt> to
047: * determine which constructor to get. Also,
048: * <tt>createTestArguments( Class, Method )</tt> is called to generate the
049: * constructor's arguments.
050: *
051: * @param theClass the class to parse for testing.
052: * @param m the method that will be tested with the new class instance.
053: * @exception InstantiationException if there was a problem creating the
054: * class.
055: * @exception NoSuchMethodException if the method does not exist in the
056: * class.
057: * @see #createTest( Class, Object[] )
058: */
059: public Test createTest(Class theClass, Method method)
060: throws InstantiationException, NoSuchMethodException,
061: InvocationTargetException, IllegalAccessException,
062: ClassCastException {
063: return createTest(theClass, createTestArguments(theClass,
064: method));
065: }
066:
067: /**
068: * Checks if the creator can be used on the given class.
069: *
070: * @param theClass the class to check if parsing is acceptable.
071: */
072: public boolean canCreate(Class theClass) {
073: try {
074: Constructor c = getConstructor(theClass);
075: return (c != null);
076: } catch (Exception ex) {
077: return false;
078: }
079: }
080:
081: /**
082: * Discovers the constructor for the test class which will be used in
083: * the instantiation of a new instance of the class. This constructor
084: * will be discovered through a call to
085: * <tt>getConstructorArgTypes</tt>. The returned constructor must be
086: * callable through <tt>createTestArguments</tt>.
087: *
088: * @param theClass the class to parse for testing.
089: * @return the constructor to create a new test instance with.
090: * @exception NoSuchMethodException if the class does not have a
091: * constructor with the arguments returned by
092: * <tt>getConstructorArgTypes</tt>.
093: * @see #getConstructorArgTypes( Class )
094: * @see #createTest( Class, Method )
095: * @see #createTestArguments( Class, Method )
096: */
097: protected Constructor getConstructor(final Class theClass)
098: throws NoSuchMethodException {
099: return theClass
100: .getConstructor(getConstructorArgTypes(theClass));
101: }
102:
103: /**
104: * Allows for pluggable constructor types. The default action is to
105: * return <tt>java.lang.String</tt>.
106: *
107: * @param theClass the class to parse for testing.
108: * @return the set of classes which define the constructor to extract.
109: */
110: protected Class[] getConstructorArgTypes(Class theClass) {
111: return new Class[] { String.class };
112: }
113:
114: /**
115: *
116: *
117: * @param theClass the class to parse for testing.
118: * @param m the method that will be tested with the new class instance.
119: */
120: protected Object[] createTestArguments(Class theClass, Method method) {
121: return new Object[] { method.getName() };
122: }
123:
124: /**
125: * Creates a new test class instance.
126: *
127: * @param theClass the class to parse for testing.
128: * @param constructorArgs arguments for the constructor retrieved through
129: * <tt>getConstructor()</tt>.
130: * @return the new Test.
131: * @exception InstantiationException if a new instance could not be made
132: * of the test class.
133: * @exception NoSuchMethodException if the constructor could not be found.
134: * @see #getConstructor( Class )
135: */
136: protected Test createTest(Class theClass, Object[] constructorArgs)
137: throws InstantiationException, NoSuchMethodException,
138: InvocationTargetException, IllegalAccessException,
139: ClassCastException {
140: Constructor c = getConstructor(theClass);
141: Test t;
142: try {
143: t = (Test) c.newInstance(constructorArgs);
144: } catch (IllegalArgumentException iae) {
145: StringBuffer args = new StringBuffer(
146: "Arguments didn't match for constructor ");
147: args.append(c).append(" in class ").append(
148: theClass.getName()).append(". Arguments = [");
149: for (int i = 0; i < constructorArgs.length; ++i) {
150: if (i > 0) {
151: args.append(", ");
152: }
153: args.append(constructorArgs[i].getClass().getName())
154: .append(" = '").append(constructorArgs[i])
155: .append("'");
156: }
157: args.append("]: ").append(iae);
158: throw new InstantiationException(args.toString());
159: }
160: return t;
161: }
162: }
|