You can subscribe to this list here.
2001 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(80) |
Nov
(42) |
Dec
(3) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2002 |
Jan
(11) |
Feb
(50) |
Mar
(70) |
Apr
(102) |
May
(28) |
Jun
(45) |
Jul
(14) |
Aug
(75) |
Sep
(17) |
Oct
(15) |
Nov
(11) |
Dec
(4) |
2003 |
Jan
(16) |
Feb
(19) |
Mar
(21) |
Apr
(20) |
May
(29) |
Jun
(7) |
Jul
(5) |
Aug
|
Sep
|
Oct
(2) |
Nov
(3) |
Dec
(3) |
2004 |
Jan
(5) |
Feb
(4) |
Mar
(1) |
Apr
(1) |
May
(1) |
Jun
(1) |
Jul
(7) |
Aug
(1) |
Sep
(6) |
Oct
(6) |
Nov
(1) |
Dec
(2) |
2005 |
Jan
(4) |
Feb
(4) |
Mar
(15) |
Apr
(1) |
May
|
Jun
(4) |
Jul
(6) |
Aug
(6) |
Sep
|
Oct
(4) |
Nov
(2) |
Dec
(4) |
2006 |
Jan
|
Feb
(91) |
Mar
(47) |
Apr
(7) |
May
(4) |
Jun
(9) |
Jul
(1) |
Aug
|
Sep
(5) |
Oct
(36) |
Nov
(95) |
Dec
(12) |
2007 |
Jan
(11) |
Feb
(31) |
Mar
(45) |
Apr
(11) |
May
(9) |
Jun
(1) |
Jul
(146) |
Aug
(15) |
Sep
|
Oct
(3) |
Nov
(6) |
Dec
(1) |
2008 |
Jan
(2) |
Feb
(1) |
Mar
(1) |
Apr
(1) |
May
(1) |
Jun
(3) |
Jul
(2) |
Aug
(19) |
Sep
(1) |
Oct
(10) |
Nov
|
Dec
(8) |
2009 |
Jan
(3) |
Feb
(1) |
Mar
(4) |
Apr
(8) |
May
(5) |
Jun
(4) |
Jul
(2) |
Aug
(1) |
Sep
(2) |
Oct
(13) |
Nov
(13) |
Dec
(4) |
2010 |
Jan
(1) |
Feb
(2) |
Mar
(1) |
Apr
(2) |
May
|
Jun
(1) |
Jul
(3) |
Aug
(2) |
Sep
|
Oct
|
Nov
|
Dec
(1) |
2011 |
Jan
(1) |
Feb
(4) |
Mar
(3) |
Apr
(4) |
May
|
Jun
(12) |
Jul
(16) |
Aug
(4) |
Sep
(7) |
Oct
|
Nov
|
Dec
|
2012 |
Jan
|
Feb
|
Mar
(2) |
Apr
|
May
(2) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2013 |
Jan
|
Feb
|
Mar
(4) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2014 |
Jan
(5) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(3) |
Dec
|
From: David S. <ds...@us...> - 2006-11-21 18:53:16
|
Update of /cvsroot/junit/junit/src/junit/framework In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv19673/src/junit/framework Log Message: Directory /cvsroot/junit/junit/src/junit/framework added to the repository |
From: David S. <ds...@us...> - 2006-11-21 18:53:15
|
Update of /cvsroot/junit/junit/src/junit/samples In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv19673/src/junit/samples Log Message: Directory /cvsroot/junit/junit/src/junit/samples added to the repository |
From: David S. <ds...@us...> - 2006-11-21 18:53:15
|
Update of /cvsroot/junit/junit/src/junit/extensions In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv19673/src/junit/extensions Log Message: Directory /cvsroot/junit/junit/src/junit/extensions added to the repository |
From: David S. <ds...@us...> - 2006-11-21 18:53:15
|
Update of /cvsroot/junit/junit/src/junit/tests/framework In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv19673/src/junit/tests/framework Log Message: Directory /cvsroot/junit/junit/src/junit/tests/framework added to the repository |
From: David S. <ds...@us...> - 2006-11-21 18:53:15
|
Update of /cvsroot/junit/junit/src/junit/textui In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv19673/src/junit/textui Log Message: Directory /cvsroot/junit/junit/src/junit/textui added to the repository |
From: David S. <ds...@us...> - 2006-11-21 18:53:15
|
Update of /cvsroot/junit/junit/src/org/junit/runner/notification In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv19673/src/org/junit/runner/notification Log Message: Directory /cvsroot/junit/junit/src/org/junit/runner/notification added to the repository |
From: David S. <ds...@us...> - 2006-11-21 18:53:15
|
Update of /cvsroot/junit/junit/src/junit In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv19673/src/junit Log Message: Directory /cvsroot/junit/junit/src/junit added to the repository |
From: David S. <ds...@us...> - 2006-11-21 18:53:15
|
Update of /cvsroot/junit/junit/src In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv19673/src Log Message: Directory /cvsroot/junit/junit/src added to the repository |
From: David S. <ds...@us...> - 2006-11-21 18:53:15
|
Update of /cvsroot/junit/junit/src/junit/tests/extensions In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv19673/src/junit/tests/extensions Log Message: Directory /cvsroot/junit/junit/src/junit/tests/extensions added to the repository |
From: David S. <ds...@us...> - 2006-11-16 19:17:56
|
Update of /cvsroot/junit/junit In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv25645 Modified Files: build.xml README.html .classpath Log Message: - Fixed raw types because Eclipse 3.3 told us to. - No longer dynamically check arrays that are statically typed as objects. - Update documentation to 4.2 Index: build.xml =================================================================== RCS file: /cvsroot/junit/junit/build.xml,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- build.xml 17 Mar 2006 02:41:10 -0000 1.17 +++ build.xml 16 Nov 2006 19:17:42 -0000 1.18 @@ -1,6 +1,6 @@ <project name="junit" default="dist" basedir="."> <property file="${user.home}/.junit.properties" /> - <property name="version" value="4.1" /> + <property name="version" value="4.2" /> <property name="dist" value="junit${version}" /> <property name="versionfile" value="junit/runner/Version.java" /> <property name="zipfile" value="${dist}.zip" /> @@ -37,7 +37,7 @@ </copy> </target> - <target name="dist" depends="build"> + <target name="dist" depends="clean, build"> <delete dir="${dist}" /> <mkdir dir="${dist}" /> <jar Index: README.html =================================================================== RCS file: /cvsroot/junit/junit/README.html,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- README.html 27 Apr 2006 22:08:57 -0000 1.16 +++ README.html 16 Nov 2006 19:17:42 -0000 1.17 @@ -4,13 +4,13 @@ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="GENERATOR" content="Microsoft FrontPage 4.0"> <meta name="Author" content="Erich Gamma, Kent Beck, and David Saff"> - <title>JUnit 4.1</title> + <title>JUnit 4.2</title> </head> <body> <h1> <b><font color="#00CC00">J</font><font color="#FF0000">U</font><font color="#000000">nit -4.1</b></h1> +4.2</b></h1> <br>Brought to you by <a href="http://www.threeriversinstitute.org">Kent Beck</a>, Erich Gamma, and <a href="http://pag.csail.mit.edu/continuoustesting">David Saff</a>. @@ -20,7 +20,7 @@ <br>(see also <a href="http://www.junit.org">JUnit.org</a>) <hr WIDTH="100%"> -<br>27 April 2006 +<br>16 November 2006 <p>JUnit is a simple framework to write repeatable tests. It is an instance of the xUnit architecture for unit testing frameworks. <ul> @@ -43,6 +43,18 @@ </ul> <h2> +<a NAME="Summary of"></a>Summary of Changes with version 4.2</h2> +<p> +<ul> +<li>Bug fix: Inaccessible base class is caught at test construction time. +<li>Bug fix: Circular suites are caught at test construction time. +<li>Improved error messages for array comparison("arrays first differed at element [1][0]") +<li>Test constructors that throw exceptions are reported correctly. +</ul> +</p> + + +<h2> <a NAME="Summary of"></a>Summary of Changes with version 4.1</h2> <p> <ul> @@ -78,13 +90,13 @@ </tr> <tr> -<td><tt>junit-4.1.jar</tt></td> +<td><tt>junit-4.2.jar</tt></td> <td>a jar file with the JUnit framework</td> </tr> <tr> -<td><tt>junit-4.1-src.jar</tt></td> +<td><tt>junit-4.2-src.jar</tt></td> <td>a jar file with the source code of the JUnit framework</td> </tr> @@ -125,20 +137,20 @@ Below are the installation steps for installing JUnit: <ol> <li> -unzip the junit4.1.zip file</li> +unzip the junit4.2.zip file</li> <li> -add<i> </i><b>junit-4.1.jar</b> to the CLASSPATH. For example: -<tt> set classpath=%classpath%;INSTALL_DIR\junit-4.1.jar;INSTALL_DIR</tt></li> +add<i> </i><b>junit-4.2.jar</b> to the CLASSPATH. For example: +<tt> set classpath=%classpath%;INSTALL_DIR\junit-4.2.jar;INSTALL_DIR</tt></li> <li> test the installation by running <tt>java org.junit.runner.JUnitCore org.junit.tests.AllTests.</tt></li> <br><b><font color="#FF0000">Notice</font></b>: that the tests are not -contained in the junit-4.1.jar but in the installation directory directly. +contained in the junit-4.2.jar but in the installation directory directly. Therefore make sure that the installation directory is on the class path </ol> -<b><font color="#FF0000">Important</font></b>: don't install junit-4.1.jar +<b><font color="#FF0000">Important</font></b>: don't install junit-4.2.jar into the extension directory of your JDK installation. If you do so the test class on the files system will not be found. <h2> Index: .classpath =================================================================== RCS file: /cvsroot/junit/junit/.classpath,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- .classpath 30 Sep 2006 00:35:00 -0000 1.6 +++ .classpath 16 Nov 2006 19:17:42 -0000 1.7 @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <classpath> - <classpathentry excluding="bin/|doc/|junit4.0*/**|junit4.1*/**" kind="src" path=""/> + <classpathentry excluding="bin/|doc/|junit4.*/**" kind="src" path=""/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> <classpathentry kind="output" path="bin"/> </classpath> |
From: David S. <ds...@us...> - 2006-11-16 19:17:52
|
Update of /cvsroot/junit/junit/org/junit/runner In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv25645/org/junit/runner Modified Files: JUnitCore.java Request.java Description.java Log Message: - Fixed raw types because Eclipse 3.3 told us to. - No longer dynamically check arrays that are statically typed as objects. - Update documentation to 4.2 Index: JUnitCore.java =================================================================== RCS file: /cvsroot/junit/junit/org/junit/runner/JUnitCore.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- JUnitCore.java 25 Aug 2006 14:43:02 -0000 1.6 +++ JUnitCore.java 16 Nov 2006 19:17:42 -0000 1.7 @@ -16,7 +16,7 @@ * <code>java org.junit.runner.JUnitCore TestClass1 TestClass2 ...</code>. * For one-shot test runs, use the static method {@link #runClasses(Class[])}. * If you want to add special listeners, - * create an instance of {@link org.junit.tests.JUnitCoreTest} first and use it to run the tests. + * create an instance of {@link org.junit.runner.JUnitCore} first and use it to run the tests. * * @see org.junit.runner.Result * @see org.junit.runner.notification.RunListener @@ -56,7 +56,7 @@ * @param classes Classes in which to find tests * @return a {@link Result} describing the details of the test run and the failed tests. */ - public static Result runClasses(Class... classes) { + public static Result runClasses(Class<?>... classes) { return new JUnitCore().run(classes); } @@ -65,7 +65,7 @@ */ public Result runMain(String... args) { System.out.println("JUnit version " + Version.id()); - List<Class> classes= new ArrayList<Class>(); + List<Class<?>> classes= new ArrayList<Class<?>>(); List<Failure> missingClasses= new ArrayList<Failure>(); for (String each : args) try { @@ -96,7 +96,7 @@ * @param classes the classes containing tests * @return a {@link Result} describing the details of the test run and the failed tests. */ - public Result run(Class... classes) { + public Result run(Class<?>... classes) { return run(Request.classes("All", classes)); } Index: Request.java =================================================================== RCS file: /cvsroot/junit/junit/org/junit/runner/Request.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- Request.java 25 Aug 2006 14:43:02 -0000 1.3 +++ Request.java 16 Nov 2006 19:17:42 -0000 1.4 @@ -52,7 +52,7 @@ * @param classes the classes containing the tests * @return a <code>Request</code> that will cause all tests in the classes to be run */ - public static Request classes(String collectionName, Class... classes) { + public static Request classes(String collectionName, Class<?>... classes) { return new ClassesRequest(collectionName, classes); } Index: Description.java =================================================================== RCS file: /cvsroot/junit/junit/org/junit/runner/Description.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- Description.java 25 Aug 2006 14:43:02 -0000 1.4 +++ Description.java 16 Nov 2006 19:17:42 -0000 1.5 @@ -38,7 +38,7 @@ * @param name the name of the test (a method name for test annotated with {@link org.junit.Test}) * @return a <code>Description</code> named <code>name</code> */ - public static Description createTestDescription(Class clazz, String name) { + public static Description createTestDescription(Class<?> clazz, String name) { return new Description(String.format("%s(%s)", name, clazz.getName())); } |
From: David S. <ds...@us...> - 2006-11-16 19:17:51
|
Update of /cvsroot/junit/junit/org/junit/tests In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv25645/org/junit/tests Modified Files: TimeoutTest.java AssertionTest.java Log Message: - Fixed raw types because Eclipse 3.3 told us to. - No longer dynamically check arrays that are statically typed as objects. - Update documentation to 4.2 Index: TimeoutTest.java =================================================================== RCS file: /cvsroot/junit/junit/org/junit/tests/TimeoutTest.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- TimeoutTest.java 15 Feb 2006 22:55:29 -0000 1.2 +++ TimeoutTest.java 16 Nov 2006 19:17:42 -0000 1.3 @@ -59,7 +59,7 @@ static public class TimeoutFailureTest { @Test(timeout= 100) public void success() throws InterruptedException { - Thread.sleep(200); + Thread.sleep(40000); } } Index: AssertionTest.java =================================================================== RCS file: /cvsroot/junit/junit/org/junit/tests/AssertionTest.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- AssertionTest.java 4 Oct 2006 23:27:13 -0000 1.9 +++ AssertionTest.java 16 Nov 2006 19:17:42 -0000 1.10 @@ -102,6 +102,10 @@ assertEquals(new Object[][]{{true, true}, {false, false}}, new Object[][]{{true, true}, {false, false}}); } + @Test public void multiDimensionalArraysDeclaredAsOneDimensionalAreEqual() { + assertEquals(new Object[]{new Object[] {true, true}, new Object[] {false, false}}, new Object[]{new Object[] {true, true}, new Object[] {false, false}}); + } + @Test public void multiDimensionalArraysAreNotEqual() { try { assertEquals("message", new Object[][]{{true, true}, {false, false}}, new Object[][]{{true, true}, {true, false}}); @@ -286,7 +290,8 @@ } } - @Test public void arraysDeclaredAsObjectAreComparedAsArrays() { + @Test(expected=AssertionError.class) + public void arraysDeclaredAsObjectAreComparedAsObjects() { Object a1= new Object[] {"abc"}; Object a2= new Object[] {"abc"}; assertEquals(a1, a2); |
From: David S. <ds...@us...> - 2006-11-16 19:17:50
|
Update of /cvsroot/junit/junit/junit/runner In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv25645/junit/runner Modified Files: BaseTestRunner.java Version.java Log Message: - Fixed raw types because Eclipse 3.3 told us to. - No longer dynamically check arrays that are statically typed as objects. - Update documentation to 4.2 Index: BaseTestRunner.java =================================================================== RCS file: /cvsroot/junit/junit/junit/runner/BaseTestRunner.java,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- BaseTestRunner.java 15 Feb 2006 22:55:29 -0000 1.19 +++ BaseTestRunner.java 16 Nov 2006 19:17:42 -0000 1.20 @@ -205,9 +205,7 @@ * Returns the loaded Class for a suite name. */ protected Class<? extends TestCase> loadSuiteClass(String suiteClassName) throws ClassNotFoundException { - @SuppressWarnings("unchecked") - Class<? extends TestCase> testClass = (Class<? extends TestCase>) Class.forName(suiteClassName); - return testClass; + return Class.forName(suiteClassName).asSubclass(TestCase.class); } /** Index: Version.java =================================================================== RCS file: /cvsroot/junit/junit/junit/runner/Version.java,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- Version.java 10 Mar 2006 00:52:15 -0000 1.16 +++ Version.java 16 Nov 2006 19:17:42 -0000 1.17 @@ -9,7 +9,7 @@ } public static String id() { - return "4.1"; + return "4.2"; } public static void main(String[] args) { |
From: David S. <ds...@us...> - 2006-11-16 19:17:49
|
Update of /cvsroot/junit/junit/org/junit In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv25645/org/junit Modified Files: Assert.java Log Message: - Fixed raw types because Eclipse 3.3 told us to. - No longer dynamically check arrays that are statically typed as objects. - Update documentation to 4.2 Index: Assert.java =================================================================== RCS file: /cvsroot/junit/junit/org/junit/Assert.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- Assert.java 30 Sep 2006 00:35:00 -0000 1.9 +++ Assert.java 16 Nov 2006 19:17:42 -0000 1.10 @@ -89,11 +89,7 @@ return; if (expected != null && expected.equals(actual)) return; - if (expected.getClass().isArray() && actual.getClass().isArray()) { - Object[] expectedArray= (Object[]) expected; - Object[] actualArray= (Object[]) actual; - assertEquals(message, expectedArray, actualArray); - } else if (expected instanceof String && actual instanceof String) { + else if (expected instanceof String && actual instanceof String) { String cleanMessage= message == null ? "" : message; throw new ComparisonFailure(cleanMessage, (String)expected, (String)actual); } |
From: David S. <ds...@us...> - 2006-11-16 19:17:48
|
Update of /cvsroot/junit/junit/org/junit/runners In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv25645/org/junit/runners Modified Files: Parameterized.java Suite.java Log Message: - Fixed raw types because Eclipse 3.3 told us to. - No longer dynamically check arrays that are statically typed as objects. - Update documentation to 4.2 Index: Parameterized.java =================================================================== RCS file: /cvsroot/junit/junit/org/junit/runners/Parameterized.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- Parameterized.java 25 Aug 2006 14:43:02 -0000 1.5 +++ Parameterized.java 16 Nov 2006 19:17:41 -0000 1.6 @@ -71,7 +71,7 @@ private final int fParameterSetNumber; - private final Constructor fConstructor; + private final Constructor<?> fConstructor; private TestClassRunnerForParameters(Class<?> klass, Object[] parameters, int i) { super(klass); @@ -95,8 +95,8 @@ return String.format("%s[%s]", method.getName(), fParameterSetNumber); } - private Constructor getOnlyConstructor() { - Constructor[] constructors= getTestClass().getConstructors(); + private Constructor<?> getOnlyConstructor() { + Constructor<?>[] constructors= getTestClass().getConstructors(); assertEquals(1, constructors.length); return constructors[0]; } @@ -119,7 +119,7 @@ } } - private Collection getParametersList() throws IllegalAccessException, InvocationTargetException, Exception { + private Collection<?> getParametersList() throws IllegalAccessException, InvocationTargetException, Exception { return (Collection) getParametersMethod().invoke(null); } Index: Suite.java =================================================================== RCS file: /cvsroot/junit/junit/org/junit/runners/Suite.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- Suite.java 2 Nov 2006 22:56:55 -0000 1.5 +++ Suite.java 16 Nov 2006 19:17:42 -0000 1.6 @@ -26,7 +26,7 @@ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface SuiteClasses { - public Class[] value(); + public Class<?>[] value(); } /** @@ -38,24 +38,23 @@ // This won't work correctly in the face of concurrency. For that we need to // add parameters to getRunner(), which would be much more complicated. - private static Set<Class> parents = new HashSet<Class>(); + private static Set<Class<?>> parents = new HashSet<Class<?>>(); - private static Class addParent(Class parent) throws InitializationError { + private static Class<?> addParent(Class<?> parent) throws InitializationError { if (!parents.add(parent)) throw new InitializationError(String.format("class '%s' (possibly indirectly) contains itself as a SuiteClass", parent.getName())); return parent; } - protected Suite(Class<?> klass, Class[] annotatedClasses) throws InitializationError { + protected Suite(Class<?> klass, Class<?>[] annotatedClasses) throws InitializationError { super(addParent(klass), Request.classes(klass.getName(), annotatedClasses).getRunner()); parents.remove(klass); } - private static Class[] getAnnotatedClasses(Class<?> klass) throws InitializationError { + private static Class<?>[] getAnnotatedClasses(Class<?> klass) throws InitializationError { SuiteClasses annotation= klass.getAnnotation(SuiteClasses.class); if (annotation == null) throw new InitializationError(String.format("class '%s' must have a SuiteClasses annotation", klass.getName())); - Class[] classes= annotation.value(); - return classes; + return annotation.value(); } } |
From: David S. <ds...@us...> - 2006-11-16 19:17:46
|
Update of /cvsroot/junit/junit/junit/framework In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv25645/junit/framework Modified Files: TestSuite.java JUnit4TestAdapter.java Log Message: - Fixed raw types because Eclipse 3.3 told us to. - No longer dynamically check arrays that are statically typed as objects. - Update documentation to 4.2 Index: TestSuite.java =================================================================== RCS file: /cvsroot/junit/junit/junit/framework/TestSuite.java,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- TestSuite.java 25 Aug 2006 14:43:02 -0000 1.17 +++ TestSuite.java 16 Nov 2006 19:17:41 -0000 1.18 @@ -79,9 +79,8 @@ * its argument or a no arg constructor. */ public static Constructor<? extends TestCase> getTestConstructor(Class<? extends TestCase> theClass) throws NoSuchMethodException { - Class[] args= { String.class }; try { - return theClass.getConstructor(args); + return theClass.getConstructor(String.class); } catch (NoSuchMethodException e) { // fall through } @@ -140,7 +139,7 @@ return; } - Class superClass= theClass; + Class<?> superClass= theClass; List<String> names= new ArrayList<String>(); while (Test.class.isAssignableFrom(superClass)) { for (Method each : superClass.getDeclaredMethods()) @@ -171,9 +170,9 @@ * Constructs a TestSuite from the given array of classes. * @param classes {@link TestCase}s */ - public TestSuite (Class<? extends TestCase>... classes) { - for (Class<? extends TestCase> each : classes) - addTest(new TestSuite(each)); + public TestSuite (Class<?>... classes) { + for (Class<?> each : classes) + addTest(new TestSuite(each.asSubclass(TestCase.class))); } /** @@ -289,9 +288,9 @@ } private boolean isTestMethod(Method m) { - String name= m.getName(); - Class[] parameters= m.getParameterTypes(); - Class returnType= m.getReturnType(); - return parameters.length == 0 && name.startsWith("test") && returnType.equals(Void.TYPE); + return + m.getParameterTypes().length == 0 && + m.getName().startsWith("test") && + m.getReturnType().equals(Void.TYPE); } } \ No newline at end of file Index: JUnit4TestAdapter.java =================================================================== RCS file: /cvsroot/junit/junit/junit/framework/JUnit4TestAdapter.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- JUnit4TestAdapter.java 15 Feb 2006 22:55:32 -0000 1.2 +++ JUnit4TestAdapter.java 16 Nov 2006 19:17:41 -0000 1.3 @@ -38,7 +38,7 @@ } // reflective interface for Eclipse - public Class getTestClass() { + public Class<?> getTestClass() { return fNewTestClass; } |
From: David S. <ds...@us...> - 2006-11-16 19:17:45
|
Update of /cvsroot/junit/junit/org/junit/internal/runners In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv25645/org/junit/internal/runners Modified Files: TestIntrospector.java TestClassMethodsRunner.java OldTestClassRunner.java CompositeRunner.java Log Message: - Fixed raw types because Eclipse 3.3 told us to. - No longer dynamically check arrays that are statically typed as objects. - Update documentation to 4.2 Index: TestIntrospector.java =================================================================== RCS file: /cvsroot/junit/junit/org/junit/internal/runners/TestIntrospector.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- TestIntrospector.java 27 Apr 2006 22:11:51 -0000 1.3 +++ TestIntrospector.java 16 Nov 2006 19:17:42 -0000 1.4 @@ -22,7 +22,7 @@ public List<Method> getTestMethods(Class<? extends Annotation> annotationClass) { List<Method> results= new ArrayList<Method>(); - for (Class eachClass : getSuperClasses(fTestClass)) { + for (Class<?> eachClass : getSuperClasses(fTestClass)) { Method[] methods= eachClass.getDeclaredMethods(); for (Method eachMethod : methods) { Annotation annotation= eachMethod.getAnnotation(annotationClass); @@ -63,8 +63,8 @@ return true; } - private List<Class> getSuperClasses(Class< ?> testClass) { - ArrayList<Class> results= new ArrayList<Class>(); + private List<Class<?>> getSuperClasses(Class< ?> testClass) { + ArrayList<Class<?>> results= new ArrayList<Class<?>>(); Class<?> current= testClass; while (current != null) { results.add(current); Index: TestClassMethodsRunner.java =================================================================== RCS file: /cvsroot/junit/junit/org/junit/internal/runners/TestClassMethodsRunner.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- TestClassMethodsRunner.java 3 Aug 2006 22:03:01 -0000 1.3 +++ TestClassMethodsRunner.java 16 Nov 2006 19:17:42 -0000 1.4 @@ -88,8 +88,8 @@ } public void filter(Filter filter) throws NoTestsRemainException { - for (Iterator iter= fTestMethods.iterator(); iter.hasNext();) { - Method method= (Method) iter.next(); + for (Iterator<Method> iter= fTestMethods.iterator(); iter.hasNext();) { + Method method= iter.next(); if (!filter.shouldRun(methodDescription(method))) iter.remove(); } Index: OldTestClassRunner.java =================================================================== RCS file: /cvsroot/junit/junit/org/junit/internal/runners/OldTestClassRunner.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- OldTestClassRunner.java 29 Jun 2006 23:06:46 -0000 1.3 +++ OldTestClassRunner.java 16 Nov 2006 19:17:42 -0000 1.4 @@ -20,7 +20,7 @@ @SuppressWarnings("unchecked") public OldTestClassRunner(Class<?> klass) { - this(new TestSuite((Class<? extends TestCase>) klass)); + this(new TestSuite(klass.asSubclass(TestCase.class))); } public OldTestClassRunner(Test test) { Index: CompositeRunner.java =================================================================== RCS file: /cvsroot/junit/junit/org/junit/internal/runners/CompositeRunner.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- CompositeRunner.java 15 Feb 2006 22:55:28 -0000 1.2 +++ CompositeRunner.java 16 Nov 2006 19:17:42 -0000 1.3 @@ -51,8 +51,8 @@ } public void filter(Filter filter) throws NoTestsRemainException { - for (Iterator iter= fRunners.iterator(); iter.hasNext();) { - Runner runner= (Runner) iter.next(); + for (Iterator<Runner> iter= fRunners.iterator(); iter.hasNext();) { + Runner runner= iter.next(); if (filter.shouldRun(runner.getDescription())) { filter.apply(runner); } else { |
From: David S. <ds...@us...> - 2006-11-16 19:17:45
|
Update of /cvsroot/junit/junit/org/junit/internal/requests In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv25645/org/junit/internal/requests Modified Files: ClassesRequest.java ClassRequest.java Log Message: - Fixed raw types because Eclipse 3.3 told us to. - No longer dynamically check arrays that are statically typed as objects. - Update documentation to 4.2 Index: ClassesRequest.java =================================================================== RCS file: /cvsroot/junit/junit/org/junit/internal/requests/ClassesRequest.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- ClassesRequest.java 25 Aug 2006 14:43:02 -0000 1.3 +++ ClassesRequest.java 16 Nov 2006 19:17:42 -0000 1.4 @@ -5,10 +5,10 @@ import org.junit.runner.Runner; public class ClassesRequest extends Request { - private final Class[] fClasses; + private final Class<?>[] fClasses; private final String fName; - public ClassesRequest(String name, Class... classes) { + public ClassesRequest(String name, Class<?>... classes) { fClasses= classes; fName= name; } Index: ClassRequest.java =================================================================== RCS file: /cvsroot/junit/junit/org/junit/internal/requests/ClassRequest.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- ClassRequest.java 2 Nov 2006 22:56:55 -0000 1.4 +++ ClassRequest.java 16 Nov 2006 19:17:42 -0000 1.5 @@ -17,12 +17,10 @@ @Override public Runner getRunner() { - Class runnerClass= getRunnerClass(fTestClass); + Class<? extends Runner> runnerClass= getRunnerClass(fTestClass); try { - Constructor constructor= runnerClass.getConstructor(Class.class); // TODO good error message if no such constructor - Runner runner= (Runner) constructor - .newInstance(new Object[] { fTestClass }); - return runner; + Constructor<? extends Runner> constructor= runnerClass.getConstructor(Class.class); // TODO good error message if no such constructor + return constructor.newInstance(new Object[] { fTestClass }); } catch (StackOverflowError e) { throw new RuntimeException(); } catch (Exception e) { @@ -30,7 +28,7 @@ } } - Class getRunnerClass(Class<?> testClass) { + Class<? extends Runner> getRunnerClass(Class<?> testClass) { RunWith annotation= testClass.getAnnotation(RunWith.class); if (annotation != null) { return annotation.value(); |
From: David S. <ds...@us...> - 2006-11-16 19:17:45
|
Update of /cvsroot/junit/junit/org/junit/runner/notification In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv25645/org/junit/runner/notification Modified Files: RunListener.java Log Message: - Fixed raw types because Eclipse 3.3 told us to. - No longer dynamically check arrays that are statically typed as objects. - Update documentation to 4.2 Index: RunListener.java =================================================================== RCS file: /cvsroot/junit/junit/org/junit/runner/notification/RunListener.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- RunListener.java 25 Aug 2006 14:43:03 -0000 1.4 +++ RunListener.java 16 Nov 2006 19:17:42 -0000 1.5 @@ -70,7 +70,7 @@ /** * Called when a test will not be run, generally because a test method is annotated - * with {@link org.junit.tests.TestMethodTest.IgnoredTest}. + * with {@link org.junit.Ignore}. * @param description describes the test that will not be run */ public void testIgnored(Description description) throws Exception { |
Update of /cvsroot/junit/junit/org/junit/internal/javamodel In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv24081/org/junit/internal/javamodel Modified Files: Tag: saff_r41_runner_refactoring JavaModelElement.java JavaMethod.java JavaMethodList.java WrappedJavaModelElement.java JavaClass.java Log Message: About to work on trunk with Kent Index: JavaModelElement.java =================================================================== RCS file: /cvsroot/junit/junit/org/junit/internal/javamodel/Attic/JavaModelElement.java,v retrieving revision 1.1.2.1 retrieving revision 1.1.2.2 diff -u -d -r1.1.2.1 -r1.1.2.2 --- JavaModelElement.java 18 Oct 2006 20:36:08 -0000 1.1.2.1 +++ JavaModelElement.java 16 Nov 2006 17:52:10 -0000 1.1.2.2 @@ -1,16 +1,27 @@ package org.junit.internal.javamodel; -import org.junit.runner.Description; +import org.junit.internal.runners.JavaTestInterpreter; +import org.junit.runner.Runner; import org.junit.runner.notification.Failure; import org.junit.runner.notification.RunNotifier; -public abstract class JavaModelElement { +public abstract class JavaModelElement extends Runner { + // TODO: only construct through interpreter + + private final JavaTestInterpreter fInterpreter; + + public JavaModelElement(JavaTestInterpreter interpreter) { + fInterpreter = interpreter; + } + public abstract String getName(); public void addFailure(RunNotifier runNotifier, Throwable targetException) { runNotifier - .fireTestFailure(new Failure(description(), targetException)); + .fireTestFailure(new Failure(getDescription(), targetException)); + } + + protected JavaTestInterpreter getInterpreter() { + return fInterpreter; } - - protected abstract Description description(); } Index: JavaMethod.java =================================================================== RCS file: /cvsroot/junit/junit/org/junit/internal/javamodel/Attic/JavaMethod.java,v retrieving revision 1.1.2.1 retrieving revision 1.1.2.2 diff -u -d -r1.1.2.1 -r1.1.2.2 --- JavaMethod.java 18 Oct 2006 20:36:08 -0000 1.1.2.1 +++ JavaMethod.java 16 Nov 2006 17:52:10 -0000 1.1.2.2 @@ -19,8 +19,8 @@ import org.junit.Test; import org.junit.Test.None; import org.junit.internal.runners.MethodAnnotation; -import org.junit.internal.runners.TestEnvironment; import org.junit.runner.Description; +import org.junit.runner.notification.RunNotifier; // TODO: check names of various "run" methods @@ -31,6 +31,7 @@ private final JavaClass fJavaClass; public JavaMethod(JavaClass javaClass, Method current) { + super(javaClass.getInterpreter()); fJavaClass= javaClass; fMethod= current; } @@ -79,7 +80,7 @@ // TODO: push out @Override - public Description description() { + public Description getDescription() { return Description.createTestDescription(fJavaClass.getTestClass(), getName()); } @@ -100,59 +101,56 @@ return Before.class; } - public void runWithoutBeforeAndAfter(TestEnvironment environment, - Object test) { + public void runWithoutBeforeAndAfter(RunNotifier notifier, Object test) { // TODO: is this envious of environment? try { - environment.getInterpreter().executeMethodBody(test, this); + getInterpreter().executeMethodBody(test, this); if (expectsException()) - addFailure(environment.getRunNotifier(), new AssertionError( - "Expected exception: " + expectedException().getName())); + addFailure(notifier, new AssertionError("Expected exception: " + + expectedException().getName())); } catch (InvocationTargetException e) { Throwable actual= e.getTargetException(); if (!expectsException()) - addFailure(environment.getRunNotifier(), actual); + addFailure(notifier, actual); else if (isUnexpected(actual)) { String message= "Unexpected exception, expected<" + expectedException().getName() + "> but was<" + actual.getClass().getName() + ">"; - addFailure(environment.getRunNotifier(), new Exception(message, - actual)); + addFailure(notifier, new Exception(message, actual)); } } catch (Throwable e) { // TODO: DUP on environment.getRunNotifier - addFailure(environment.getRunNotifier(), e); + addFailure(notifier, e); } } - void invokeTestMethod(TestEnvironment testEnvironment) { + void invokeTestMethod(RunNotifier notifier) { Object test; try { test= getJavaClass().newInstance(); } catch (Exception e) { - testEnvironment.getRunNotifier().testAborted(description(), e); + notifier.testAborted(getDescription(), e); return; } - run(testEnvironment, test); + run(notifier, test); } - void runWithoutTimeout(final Object test, - final TestEnvironment testEnvironment) { + void runWithoutTimeout(final Object test, final RunNotifier notifier) { // TODO: is this envious now? Yes runWithBeforeAndAfter(new Runnable() { public void run() { - runWithoutBeforeAndAfter(testEnvironment, test); + runWithoutBeforeAndAfter(notifier, test); } - }, test, testEnvironment.getRunNotifier()); + }, test, notifier); // TODO: ugly } void runWiteTimeout(long timeout, final Object test, - final TestEnvironment testEnvironment) { + final RunNotifier notifier) { ExecutorService service= Executors.newSingleThreadExecutor(); Callable<Object> callable= new Callable<Object>() { public Object call() throws Exception { - runWithoutTimeout(test, testEnvironment); + runWithoutTimeout(test, notifier); return null; } }; @@ -167,28 +165,33 @@ // if one occurred // during the invocation } catch (TimeoutException e) { - addFailure(testEnvironment.getRunNotifier(), new Exception(String - .format("test timed out after %d milliseconds", timeout))); + addFailure(notifier, new Exception(String.format( + "test timed out after %d milliseconds", timeout))); } catch (Exception e) { // TODO: DUP - addFailure(testEnvironment.getRunNotifier(), e); + addFailure(notifier, e); } } - void run(TestEnvironment environment, Object test) { + void run(RunNotifier notifier, Object test) { if (isIgnored()) { - environment.getRunNotifier().fireTestIgnored(description()); + notifier.fireTestIgnored(getDescription()); return; } - environment.getRunNotifier().fireTestStarted(description()); + notifier.fireTestStarted(getDescription()); try { long timeout= getTimeout(); if (timeout > 0) - runWiteTimeout(timeout, test, environment); + runWiteTimeout(timeout, test, notifier); else - runWithoutTimeout(test, environment); + runWithoutTimeout(test, notifier); } finally { - environment.getRunNotifier().fireTestFinished(description()); + notifier.fireTestFinished(getDescription()); } } + + @Override + public void run(RunNotifier notifier) { + invokeTestMethod(notifier); + } } \ No newline at end of file Index: JavaMethodList.java =================================================================== RCS file: /cvsroot/junit/junit/org/junit/internal/javamodel/Attic/JavaMethodList.java,v retrieving revision 1.1.2.1 retrieving revision 1.1.2.2 diff -u -d -r1.1.2.1 -r1.1.2.2 --- JavaMethodList.java 18 Oct 2006 20:36:08 -0000 1.1.2.1 +++ JavaMethodList.java 16 Nov 2006 17:52:10 -0000 1.1.2.2 @@ -6,14 +6,16 @@ import java.util.Iterator; import java.util.List; -import org.junit.internal.runners.TestEnvironment; import org.junit.runner.Description; import org.junit.runner.manipulation.Filter; +import org.junit.runner.manipulation.Filterable; import org.junit.runner.manipulation.NoTestsRemainException; +import org.junit.runner.manipulation.Sortable; import org.junit.runner.manipulation.Sorter; +import org.junit.runner.notification.RunNotifier; public class JavaMethodList extends JavaModelElement implements - Iterable<JavaMethod> { + Iterable<JavaMethod>, Filterable, Sortable { private static final long serialVersionUID= 1L; private final JavaClass fJavaClass; @@ -21,23 +23,24 @@ private List<JavaMethod> fMethods= new ArrayList<JavaMethod>(); public JavaMethodList(JavaClass javaClass) { + super(javaClass.getInterpreter()); fJavaClass= javaClass; } public void filter(Filter filter) throws NoTestsRemainException { for (Iterator<JavaMethod> iter= fMethods.iterator(); iter.hasNext();) { JavaMethod method= iter.next(); - if (!filter.shouldRun(method.description())) + if (!filter.shouldRun(method.getDescription())) iter.remove(); } if (fMethods.isEmpty()) throw new NoTestsRemainException(); } - public void filter(final Sorter sorter) { + public void sort(final Sorter sorter) { Collections.sort(fMethods, new Comparator<JavaMethod>() { public int compare(JavaMethod o1, JavaMethod o2) { - return sorter.compare(o1.description(), o2.description()); + return sorter.compare(o1.getDescription(), o2.getDescription()); } }); } @@ -64,21 +67,22 @@ } @Override - public Description description() { + public Description getDescription() { Description spec= Description.createSuiteDescription(fJavaClass .getName()); for (JavaMethod method : this) - spec.addChild(method.description()); + spec.addChild(method.getDescription()); return spec; } - public void run(TestEnvironment environment) { + @Override + public void run(RunNotifier notifier) { if (isEmpty()) // TODO: DUP - environment.getRunNotifier().testAborted(description(), new Exception( + notifier.testAborted(getDescription(), new Exception( "No runnable methods")); for (JavaMethod method : this) { - method.invokeTestMethod(environment); + method.invokeTestMethod(notifier); } } } Index: WrappedJavaModelElement.java =================================================================== RCS file: /cvsroot/junit/junit/org/junit/internal/javamodel/Attic/WrappedJavaModelElement.java,v retrieving revision 1.1.2.1 retrieving revision 1.1.2.2 diff -u -d -r1.1.2.1 -r1.1.2.2 --- WrappedJavaModelElement.java 18 Oct 2006 20:36:08 -0000 1.1.2.1 +++ WrappedJavaModelElement.java 16 Nov 2006 17:52:10 -0000 1.1.2.2 @@ -5,18 +5,23 @@ import java.util.List; import org.junit.internal.runners.FailedBefore; +import org.junit.internal.runners.JavaTestInterpreter; import org.junit.runner.notification.RunNotifier; public abstract class WrappedJavaModelElement extends JavaModelElement { + public WrappedJavaModelElement(JavaTestInterpreter interpreter) { + super(interpreter); + } + public abstract Class<? extends Annotation> getBeforeAnnotation(); - + public abstract Class<? extends Annotation> getAfterAnnotation(); - + public abstract JavaClass getJavaClass(); + void runAfters(Object test, RunNotifier runNotifier) { // TODO: train wreck - for (Method after : getJavaClass().getMethods( - getAfterAnnotation())) { + for (Method after : getJavaClass().getMethods(getAfterAnnotation())) { try { after.invoke(test); } catch (Throwable e) { @@ -25,12 +30,11 @@ } } - void runBefores(Object test, RunNotifier runNotifier) - throws FailedBefore { + void runBefores(Object test, RunNotifier runNotifier) throws FailedBefore { try { List<Method> befores= getJavaClass().getMethods( getBeforeAnnotation()); - + // TODO: no auto-correct if wrong type on left side of new-style // for? for (Method before : befores) @@ -41,7 +45,8 @@ } } - public void runWithBeforeAndAfter(Runnable protectThis, Object test, RunNotifier runNotifier) { + public void runWithBeforeAndAfter(Runnable protectThis, Object test, + RunNotifier runNotifier) { try { runBefores(test, runNotifier); protectThis.run(); Index: JavaClass.java =================================================================== RCS file: /cvsroot/junit/junit/org/junit/internal/javamodel/Attic/JavaClass.java,v retrieving revision 1.1.2.1 retrieving revision 1.1.2.2 diff -u -d -r1.1.2.1 -r1.1.2.2 --- JavaClass.java 18 Oct 2006 20:36:08 -0000 1.1.2.1 +++ JavaClass.java 16 Nov 2006 17:52:10 -0000 1.1.2.2 @@ -16,12 +16,14 @@ import org.junit.internal.runners.JavaTestInterpreter; import org.junit.internal.runners.MethodAnnotation; import org.junit.runner.Description; +import org.junit.runner.notification.RunNotifier; public class JavaClass extends WrappedJavaModelElement { // TODO: push out private final Class<?> fClass; - public JavaClass(Class<?> type) { + public JavaClass(Class<?> type, JavaTestInterpreter interpreter) { + super(interpreter); fClass= type; } @@ -32,7 +34,7 @@ // TODO: this will not add parameterized superclasses (need to use // interpreter here?) if (fClass.getSuperclass() != null) - results.addAll(new JavaClass(fClass.getSuperclass()) + results.addAll(getInterpreter().buildClass(fClass.getSuperclass()) .getSuperClasses()); return results; } @@ -131,7 +133,13 @@ } @Override - protected Description description() { + public Description getDescription() { return Description.createSuiteDescription(fClass); } + + @Override + public void run(RunNotifier notifier) { + // TODO Auto-generated method stub + + } } \ No newline at end of file |
From: David S. <ds...@us...> - 2006-11-16 17:52:17
|
Update of /cvsroot/junit/junit/org/junit/tests In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv24081/org/junit/tests Modified Files: Tag: saff_r41_runner_refactoring InaccessibleBaseClassTest.java TestMethodTest.java Log Message: About to work on trunk with Kent Index: InaccessibleBaseClassTest.java =================================================================== RCS file: /cvsroot/junit/junit/org/junit/tests/InaccessibleBaseClassTest.java,v retrieving revision 1.1 retrieving revision 1.1.2.1 diff -u -d -r1.1 -r1.1.2.1 --- InaccessibleBaseClassTest.java 28 Jun 2006 20:55:36 -0000 1.1 +++ InaccessibleBaseClassTest.java 16 Nov 2006 17:52:10 -0000 1.1.2.1 @@ -2,13 +2,14 @@ import org.junit.Test; import org.junit.internal.runners.InitializationError; +import org.junit.internal.runners.JavaTestInterpreter; import org.junit.internal.runners.MethodValidator; import org.junit.tests.anotherpackage.Sub; public class InaccessibleBaseClassTest { @Test(expected=InitializationError.class) public void inaccessibleBaseClassIsCaughtAtValidation() throws InitializationError { - MethodValidator methodValidator= new MethodValidator(Sub.class); + MethodValidator methodValidator= new MethodValidator(new JavaTestInterpreter().buildClass(Sub.class)); methodValidator.validateAllMethods(); methodValidator.assertValid(); } Index: TestMethodTest.java =================================================================== RCS file: /cvsroot/junit/junit/org/junit/tests/TestMethodTest.java,v retrieving revision 1.3.2.2 retrieving revision 1.3.2.3 diff -u -d -r1.3.2.2 -r1.3.2.3 --- TestMethodTest.java 18 Oct 2006 20:36:08 -0000 1.3.2.2 +++ TestMethodTest.java 16 Nov 2006 17:52:10 -0000 1.3.2.3 @@ -14,6 +14,7 @@ import org.junit.Ignore; import org.junit.Test; import org.junit.internal.runners.InitializationError; +import org.junit.internal.runners.JavaTestInterpreter; import org.junit.internal.runners.MethodValidator; import org.junit.internal.runners.TestClassRunner; import org.junit.runner.JUnitCore; @@ -119,7 +120,8 @@ } @Test public void overloaded() { - MethodValidator validator= new MethodValidator(Confused.class); + // TODO: DUP? + MethodValidator validator= new MethodValidator(new JavaTestInterpreter().buildClass(Confused.class)); List<Throwable> errors= validator.validateAllMethods(); assertEquals(1, errors.size()); } |
From: David S. <ds...@us...> - 2006-11-16 17:52:17
|
Update of /cvsroot/junit/junit/org/junit/runners In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv24081/org/junit/runners Modified Files: Tag: saff_r41_runner_refactoring ParameterizedInterpreter.java Log Message: About to work on trunk with Kent Index: ParameterizedInterpreter.java =================================================================== RCS file: /cvsroot/junit/junit/org/junit/runners/Attic/ParameterizedInterpreter.java,v retrieving revision 1.1.2.4 retrieving revision 1.1.2.5 diff -u -d -r1.1.2.4 -r1.1.2.5 --- ParameterizedInterpreter.java 18 Oct 2006 20:36:08 -0000 1.1.2.4 +++ ParameterizedInterpreter.java 16 Nov 2006 17:52:10 -0000 1.1.2.5 @@ -29,8 +29,8 @@ private final int fNumber; private ParameterizedJavaClass(Class<?> type, Object[] parameters, - int number) { - super(type); + int number, JavaTestInterpreter interpreter) { + super(type, interpreter); fParameters= parameters; fNumber= number; } @@ -56,8 +56,7 @@ } @Override - public JavaMethod interpretJavaMethod(final JavaClass klass, - Method method) { + public JavaMethod interpretJavaMethod(final JavaClass klass, Method method) { return new JavaMethod(klass, method) { @Override public String getName() { @@ -73,18 +72,19 @@ @Override public Runner buildRunner(Class klass) throws InitializationError { CompositeRunner runner= new CompositeRunner(klass.getName()); + JavaClass simpleClass= buildClass(klass); int i= 0; - for (final Object each : getParametersList(new JavaClass(klass))) { + for (final Object each : getParametersList(simpleClass)) { if (each instanceof Object[]) { runner .add(new TestClassMethodsRunner( new ParameterizedJavaClass(klass, - (Object[]) each, i++), this)); + (Object[]) each, i++, this), this)); } else throw new InitializationError(String.format( "%s.%s() must return a Collection of arrays.", klass - .getName(), getParametersMethod( - new JavaClass(klass)).getName())); + .getName(), getParametersMethod(simpleClass) + .getName())); } return runner; } |
From: David S. <ds...@us...> - 2006-11-16 17:52:15
|
Update of /cvsroot/junit/junit/org/junit/internal/runners In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv24081/org/junit/internal/runners Modified Files: Tag: saff_r41_runner_refactoring TestClassMethodsRunner.java JavaTestInterpreter.java MethodValidator.java TestClassRunner.java Removed Files: Tag: saff_r41_runner_refactoring TestEnvironment.java Log Message: About to work on trunk with Kent Index: TestClassMethodsRunner.java =================================================================== RCS file: /cvsroot/junit/junit/org/junit/internal/runners/TestClassMethodsRunner.java,v retrieving revision 1.3.2.6 retrieving revision 1.3.2.7 diff -u -d -r1.3.2.6 -r1.3.2.7 --- TestClassMethodsRunner.java 18 Oct 2006 20:36:08 -0000 1.3.2.6 +++ TestClassMethodsRunner.java 16 Nov 2006 17:52:10 -0000 1.3.2.7 @@ -15,26 +15,23 @@ Sortable { private final JavaMethodList fTestMethods; - private final JavaTestInterpreter fInterpreter; - // This assumes that some containing runner will perform validation of the // test methods public TestClassMethodsRunner(JavaClass klass, JavaTestInterpreter javaTestInterpreter) { fTestMethods= klass.getTestMethods(javaTestInterpreter); - fInterpreter= javaTestInterpreter; } // TODO: rename method to element? @Override public void run(RunNotifier notifier) { - fTestMethods.run(new TestEnvironment(fInterpreter, notifier)); + fTestMethods.run(notifier); } @Override public Description getDescription() { - return fTestMethods.description(); + return fTestMethods.getDescription(); } public void filter(Filter filter) throws NoTestsRemainException { @@ -42,6 +39,6 @@ } public void sort(final Sorter sorter) { - fTestMethods.filter(sorter); + fTestMethods.sort(sorter); } } \ No newline at end of file Index: JavaTestInterpreter.java =================================================================== RCS file: /cvsroot/junit/junit/org/junit/internal/runners/Attic/JavaTestInterpreter.java,v retrieving revision 1.1.2.5 retrieving revision 1.1.2.6 diff -u -d -r1.1.2.5 -r1.1.2.6 --- JavaTestInterpreter.java 18 Oct 2006 20:36:08 -0000 1.1.2.5 +++ JavaTestInterpreter.java 16 Nov 2006 17:52:10 -0000 1.1.2.6 @@ -28,10 +28,11 @@ } public Runner buildRunner(Class<?> klass) throws InitializationError { - MethodValidator methodValidator= new MethodValidator(klass); + JavaClass built= buildClass(klass); + MethodValidator methodValidator= new MethodValidator(built); validate(methodValidator); methodValidator.assertValid(); - return new TestClassMethodsRunner(new JavaClass(klass), this); + return new TestClassMethodsRunner(built, this); } protected void validate(MethodValidator methodValidator) { @@ -41,4 +42,8 @@ public JavaMethod interpretJavaMethod(final JavaClass klass, Method method) { return new JavaMethod(klass, method); } + + public JavaClass buildClass(Class<?> superclass) { + return new JavaClass(superclass, this); + } } Index: MethodValidator.java =================================================================== RCS file: /cvsroot/junit/junit/org/junit/internal/runners/MethodValidator.java,v retrieving revision 1.3.2.4 retrieving revision 1.3.2.5 diff -u -d -r1.3.2.4 -r1.3.2.5 --- MethodValidator.java 18 Oct 2006 20:36:08 -0000 1.3.2.4 +++ MethodValidator.java 16 Nov 2006 17:52:10 -0000 1.3.2.5 @@ -18,8 +18,8 @@ private final JavaClass fJavaClass; - public MethodValidator(Class<?> testClass) { - fJavaClass= new JavaClass(testClass); + public MethodValidator(JavaClass testClass) { + fJavaClass= testClass; } public void validateInstanceMethods() { Index: TestClassRunner.java =================================================================== RCS file: /cvsroot/junit/junit/org/junit/internal/runners/TestClassRunner.java,v retrieving revision 1.2.2.5 retrieving revision 1.2.2.6 diff -u -d -r1.2.2.5 -r1.2.2.6 --- TestClassRunner.java 18 Oct 2006 20:36:08 -0000 1.2.2.5 +++ TestClassRunner.java 16 Nov 2006 17:52:10 -0000 1.2.2.6 @@ -1,6 +1,5 @@ package org.junit.internal.runners; -import org.junit.internal.javamodel.JavaClass; import org.junit.runner.Description; import org.junit.runner.Runner; import org.junit.runner.manipulation.Filter; @@ -15,6 +14,8 @@ private final Class<?> fTestClass; + private final JavaTestInterpreter fInterpreter; + public TestClassRunner(Class<?> klass) throws InitializationError { this(klass, new JavaTestInterpreter()); } @@ -22,6 +23,7 @@ public TestClassRunner(Class<?> klass, JavaTestInterpreter interpreter) throws InitializationError { fTestClass= klass; + fInterpreter= interpreter; fEnclosedRunner= interpreter.buildRunner(klass); } @@ -33,7 +35,7 @@ } }; - new JavaClass(getTestClass()).runWithBeforeAndAfter(protectThis, null, + fInterpreter.buildClass(getTestClass()).runWithBeforeAndAfter(protectThis, null, notifier); } --- TestEnvironment.java DELETED --- |
From: David S. <sa...@mi...> - 2006-11-07 16:28:19
|
On 11/3/06, Jun...@li... < Jun...@li...> wrote: > This is certainly true for smaller projects and test suits. Might be > nice though, to find some of the problems *before* proceding into an > half hour build and test cycle, if you are just using ANT. I can understand that. > One reason for a little inertia here is that Kent and Erich have tried > > to maintain a position as a "leaf in the technology tree", that is, > > having dependency on nothing but Java. > > Nothing to add there. Sure enough, the patch currently doesn't add any > other dependency outside of the JDK 1.5 tools.jar. tools.jar already contains APT? I wasn't aware of that (as I said, I'm new here. :-) - While writing the processor, some of the design choices for junit > annotations proved critical. This is especially the case, if the > presence of certain annotations at one declaration is in subtle ways > depending on the presence/absence of others. > E. g.: what should be the behavior of junit for class having > @RunWith(Suite.class), no @Suite.Classes() but a @Parameters method? > What about having several methods annotated with @Parameters in the same > hierarchie of classes? You had mentioned earlier the idea that there are several runners that are somewhat redundant with their "characteristic" further-information annotations. I think that this can lead to some interesting new design choices, but I'm still ruminating about that. For now, the next thing for me to do is probably look at the code and run it, and that will help us think further. I can't promise I'll get to it in less than a week. Thanks, David Saff |
From: David S. <sa...@mi...> - 2006-10-31 17:07:19
|
Thomas, Thank you for teaching me more about APT. After asking the more specific questions, I should probably move back to the big question. What is the primary goal of this patch? Will Eclipse, for example, flag errors at compile time if this is included? Otherwise, it would seem that whether APT or the runtime finds problems is going to be fairly transparent to users. One reason for a little inertia here is that Kent and Erich have tried to maintain a position as a "leaf in the technology tree", that is, having dependency on nothing but Java. I want to see this discussion through, but right now, I'm thinking that the best path may be to have this released separately into the JUnit ecosystem, and see if it gathers a following as an add-on to JUnit. What do you think? David Saff worodin wrote: > David, > > for 1.) > Short answer: The patch actually does this. > Long answer: > The patch places the APT processor into the same junit.jar as the > runtime, so users may drop the jar simply into the classpath of apt, > which is shared with javac, if you order apt to trigger the > compile too, (e.g by *not* using the option '-nocompile'). > > In fact, it is problematic to separate the required classes into > different jars, as in any case, you are likely to need access to the > compiled annotation classes, which would end up in both jars then. > > On a similar track, since the processor isn't generating anything, but > only doing checks, its currently not strictly a prerequisite to > compiling & running the tests. So prudence requires, that the runtime > checks remain in place; but we might want to share the resulting messages. > > For 2.) > APT caters for having several processors in the same build. > The processor needs to implement an information method, telling apt > which annotations to process. Apt detects process factorys, by peeking > into META-INF/services/com.sun.mirror.apt.AnnotationProcessorFactory of > every jar found in the -classpath or -factorypath of apt. > > This means: in the current state of the patch, a supplier of another > annotation (junit related or not) would have to implement its own > processor, and register it as mentioned above. > > Of course, we could start thinking about sort of an extension framework > for integrating junit specific extensions into our processor, but this > would require us to forsee all the needs of those, which proves > difficult. In our case: we would have to define an interface, that > abstracts the handling for treating any runner, and a way to look up > an implementation of that interface for any given runner. > > While this could be done, I'm still wondering if we really do need to to > specify runners via @RunWith. As far as I can see we currently have: > > - The default runner, which is used if non is specified. > - The Suite Runner, which *needs* to be used for a suite, > iff a @Suite.Classes() annotation is present, that is. > - The Parameterized Runner, which only makes sense, if there is also > an @Parametesr annotation. > > Are there more? > My impression is, we might be better off, dropping the @RunWith > annotations, and infering the proper runner from other annotations. > > Dreaming on, this could result in having a resolver, that starts nesting > runners, if there are several annotations that require different runners > - ordering might become a problem here. > > Thomas > > David Saff schrieb: > >> Thomas, >> >> It's certainly an interesting approach, and is a candidate for division >> of responsibilities. I've been meaning to learn more about APT. I >> wonder about the following challenges: >> >> 1) Can we avoid creating two runtimes, one for APT, and the other for >> the test execution? >> 2) If third parties create custom runners with custom annotations, how >> do they plug into the APT checks? >> >> David Saff >> >> worodin wrote: >> >>> Hey ho list! >>> >>> As a reference for this thread, pls take a look at >>> https://sourceforge.net/tracker/?func=detail&atid=315278&aid=1581916&group_id=15278 >>> >>> and try the jar. >>> >>> E. g. executing a task like >>> >>> <exec executable="C:/dev/tool/sun/j2sdk/1.5.0_07/bin/apt.exe"> >>> <arg line='-classpath ".;./junit4.1/junit-4.1.jar" -nocompile -d "." >>> org/junit/tests/apt/*.java'/> >>> </exec> >>> >>> against the test classes supplied in the patch would yield: >>> >>> [exec] org/junit/tests/apt/AllTests.java:41: The abstract test >>> class org.junit.tests.apt.TestAfter can not be instanced by suite runner >>> [exec] public class AllTests { >>> [exec] ^ >>> [exec] org/junit/tests/apt/AllTests.java:41: The abstract test >>> class org.junit.tests.apt.TestAfterClass can not be instanced by suite >>> runner >>> [exec] public class AllTests { >>> [exec] ^ >>> [exec] org/junit/tests/apt/AllTests.java:41: The abstract test >>> class org.junit.tests.apt.TestBefore can not be instanced by suite runner >>> [exec] public class AllTests { >>> [exec] ^ >>> [exec] org/junit/tests/apt/AllTests.java:41: The abstract test >>> class org.junit.tests.apt.TestBeforeClass can not be instanced by suite >>> runner >>> [exec] public class AllTests { >>> [exec] ^ >>> [exec] org/junit/tests/apt/AllTests.java:41: The abstract test >>> class org.junit.tests.apt.Quiet can not be instanced by suite runner >>> [exec] public class AllTests { >>> [exec] ^ >>> [exec] org/junit/tests/apt/EmptySuiteClasses.java:11: warning: >>> Annotation @SuiteClasses was empty - nothing to test. >>> [exec] public class EmptySuiteClasses {} >>> [exec] ^ >>> [exec] org/junit/tests/apt/NoSuiteClasses.java:8: warning: Classes >>> annotated with @RunWith(Suite.class) should also be annotated with a non >>> empty @SuiteClasses({}). The resulting test suite is empty. >>> [exec] public class NoSuiteClasses {} >>> [exec] ^ >>> [exec] org/junit/tests/apt/NotThrowing.java:7: Checked Exception >>> org.junit.tests.apt.NotThrowing.MyException will never be thrown, >>> because it isn't declared for method notThrowing. This test will allways >>> fail. >>> [exec] @Test(expected=MyException.class) public void >>> notThrowing() {} >>> [exec] ^ >>> [exec] org/junit/tests/apt/OrphanedSuite.java:7: warning: The >>> annotation @SuiteClasses({...}) is only of use for classes also >>> annotated with @RunWith(Suite.class). >>> [exec] public class OrphanedSuite {} >>> [exec] ^ >>> [exec] org/junit/tests/apt/StaticTest.java:7: Methods annotated >>> with org.junit.Test must not be static. >>> [exec] @Test public static void staticTest() {} >>> [exec] ^ >>> [exec] org/junit/tests/apt/TestAfter.java:7: Methods annotated with >>> org.junit.After need to return void. >>> [exec] @After public int notVoid(Object o) {return 0;} >>> [exec] ^ >>> [exec] org/junit/tests/apt/TestAfter.java:7: Methods annotated with >>> org.junit.After shouldn't have parameters. >>> [exec] @After public int notVoid(Object o) {return 0;} >>> [exec] ^ >>> [exec] org/junit/tests/apt/TestAfterClass.java:7: Methods annotated >>> with org.junit.AfterClass need to be public. >>> [exec] @AfterClass void notPublic(Object o) {} >>> [exec] ^ >>> [exec] org/junit/tests/apt/TestAfterClass.java:7: Methods annotated >>> with org.junit.AfterClass shouldn't have parameters. >>> [exec] @AfterClass void notPublic(Object o) {} >>> [exec] ^ >>> [exec] org/junit/tests/apt/TestAfterClass.java:7: Methods annotated >>> with org.junit.AfterClass need to be static. >>> [exec] @AfterClass void notPublic(Object o) {} >>> [exec] ^ >>> [exec] org/junit/tests/apt/TestBefore.java:7: Methods annotated >>> with org.junit.Before need to be public. >>> [exec] @Before int notPublicNotVoid() {return 0;} >>> [exec] ^ >>> [exec] org/junit/tests/apt/TestBefore.java:7: Methods annotated >>> with org.junit.Before need to return void. >>> [exec] @Before int notPublicNotVoid() {return 0;} >>> [exec] ^ >>> [exec] org/junit/tests/apt/TestBeforeClass.java:7: Methods >>> annotated with org.junit.BeforeClass need to be public. >>> [exec] @BeforeClass int notPublicNotVoid(Object o) {return 0;} >>> [exec] ^ >>> [exec] org/junit/tests/apt/TestBeforeClass.java:7: Methods >>> annotated with org.junit.BeforeClass need to return void. >>> [exec] @BeforeClass int notPublicNotVoid(Object o) {return 0;} >>> [exec] ^ >>> [exec] org/junit/tests/apt/TestBeforeClass.java:7: Methods >>> annotated with org.junit.BeforeClass shouldn't have parameters. >>> [exec] @BeforeClass int notPublicNotVoid(Object o) {return 0;} >>> [exec] ^ >>> [exec] org/junit/tests/apt/TestBeforeClass.java:7: Methods >>> annotated with org.junit.BeforeClass need to be static. >>> [exec] @BeforeClass int notPublicNotVoid(Object o) {return 0;} >>> [exec] ^ >>> [exec] org/junit/tests/apt/TestHasParameters.java:7: Methods >>> annotated with org.junit.Test shouldn't have parameters. >>> [exec] @Test public void hasParameters(Object o) {} >>> [exec] ^ >>> [exec] org/junit/tests/apt/TestInheritedParameters.java:11: Methods >>> annotated with org.junit.runners.Parameterized.Parameters are required >>> to return java.util.Collection<java.lang.Object[]>. >>> [exec] @Parameters public static Object data2() {return new >>> Object();} >>> [exec] ^ >>> [exec] org/junit/tests/apt/TestNotPublic.java:7: Methods annotated >>> with org.junit.Test need to be public. >>> [exec] @Test void notPublic() {} >>> [exec] ^ >>> [exec] org/junit/tests/apt/TestNotVoid.java:7: Methods annotated >>> with org.junit.Test need to return void. >>> [exec] @Test public int notVoid() {return 0;} >>> [exec] ^ >>> [exec] >>> org/junit/tests/apt/TestParameterizedWith2Constructors.java:15: >>> Constructor competes with one allready seen at >>> org/junit/tests/apt/TestParameterizedWith2Constructors.java:14 - classes >>> annotated with @RunWith(Parameterized.class) require exactly one public >>> constructor taking the parameters. >>> [exec] public TestParameterizedWith2Constructors() {} >>> [exec] ^ >>> [exec] >>> org/junit/tests/apt/TestParameterizedWith2Constructors.java:12: >>> org.junit.tests.apt.TestParameterizedWith2Constructors contains 2 public >>> constructors - classes annotated with @RunWith(Parameterized.class) >>> require exactly one public constructor taking the parameters. >>> [exec] public class TestParameterizedWith2Constructors { >>> [exec] ^ >>> [exec] >>> org/junit/tests/apt/TestParameterizedWith2ParameterMethods.java:26: >>> warning: Method annotated with @Parameters competes with one allready >>> seen at >>> org/junit/tests/apt/TestParameterizedWith2ParameterMethods.java:20 - as >>> of Junit 4.1, only one of them will be used to retrieve test parameters. >>> [exec] @Parameters public static Collection<Object[]> data2() { >>> [exec] ^ >>> [exec] >>> org/junit/tests/apt/TestParameterizedWith2ParameterMethods.java:11: >>> warning: There are 2 competing methods all annotated with @Parameters - >>> as of Junit 4.1, only one of them will be used to retrieve test >>> parameters. >>> [exec] public class TestParameterizedWith2ParameterMethods { >>> [exec] ^ >>> [exec] >>> org/junit/tests/apt/TestParameterizedWithNoParameterMethods.java:9: >>> Class org.junit.tests.apt.TestParameterizedWithNoParameterMethods is not >>> abstract, annotated as @RunWith(Parameterized.class), but there is no >>> instance method annotated with @Parameters within the type hierarchy: >>> There will be nothing to test. >>> [exec] public class TestParameterizedWithNoParameterMethods { >>> [exec] ^ >>> [exec] org/junit/tests/apt/TestParameters.java:11: Methods >>> annotated with org.junit.runners.Parameterized.Parameters are required >>> to return java.util.Collection<java.lang.Object[]>. >>> [exec] @Parameters public static Object data2() {return new >>> Object();} >>> [exec] ^ >>> [exec] org/junit/tests/apt/SuiteCycle.java:25: The following >>> classes annotated with @RunWith(Suite.class) form a loop: >>> org.junit.tests.apt.SuiteCycle.ASuite -> >>> org.junit.tests.apt.SuiteCycle.AnotherSuite - invoking any of them will >>> result in a stack overflow at runtime. >>> [exec] public static class ASuite {} >>> [exec] ^ >>> [exec] org/junit/tests/apt/SuiteCycle.java:25: Referenced suite >>> org.junit.tests.apt.SuiteCycle.AnotherSuite is part of or references a >>> loop of suits - invokation will cause a stack overflow at runtime. >>> [exec] public static class ASuite {} >>> [exec] ^ >>> [exec] org/junit/tests/apt/SuiteCycle.java:21: Referenced suite >>> org.junit.tests.apt.SuiteCycle.ASuite is part of or references a loop of >>> suits - invokation will cause a stack overflow at runtime. >>> [exec] public class SuiteCycle { >>> [exec] ^ >>> [exec] org/junit/tests/apt/AllTests.java:41: Referenced suite >>> org.junit.tests.apt.SuiteCycle is part of or references a loop of suits >>> - invokation will cause a stack overflow at runtime. >>> [exec] public class AllTests { >>> [exec] ^ >>> [exec] org/junit/tests/apt/NoTestInSuiteClass.java:11: warning: >>> Test case org.junit.tests.apt.NoTestInSuiteClass doesn't contain any >>> test methods. >>> [exec] public class NoTestInSuiteClass {} >>> [exec] ^ >>> [exec] org/junit/tests/apt/NoSuiteClasses.java:8: warning: Test >>> case org.junit.tests.apt.NoSuiteClasses doesn't contain any test methods. >>> [exec] public class NoSuiteClasses {} >>> [exec] ^ >>> [exec] org/junit/tests/apt/EmptySuiteClasses.java:11: warning: Test >>> case org.junit.tests.apt.EmptySuiteClasses doesn't contain any test >>> methods. >>> [exec] public class EmptySuiteClasses {} >>> [exec] ^ >>> [exec] org/junit/tests/apt/ClassNotPublic.java:9: Class >>> org.junit.tests.apt.ClassNotPublic has to be public in order to be >>> instanced. >>> [exec] class ClassNotPublic { >>> [exec] ^ >>> [exec] org/junit/tests/apt/NoValidConstructors.java:6: This test >>> class requires a public no argument constructor. >>> [exec] public class NoValidConstructors { >>> [exec] ^ >>> [exec] 32 errors >>> [exec] 8 warnings >>> [exec] Result: 1 >>> >>> >>> As far as I can tell, the checks are pretty complete, but I'm open to >>> suggestions. The processor might do with some refactoring, but hey, it's >>> my first try at apt. >>> >>> I see several spin offs: >>> >>> - the apt processor uses 20+ messages (Errors and warnings), some of >>> them intersecting with runtime messages. It might be viable, to start >>> pooling all messages used in org.junit in a jdk 1.5 enumeration. >>> >>> - as an afterthought, I wonder if we really need @RunWith. AFAICT, the >>> proper runner can mostly infered from an other annotation, e. g. >>> @SuiteClasses or @Parameters, leaving the rest to the default runner. >>> >>> - the patch contains a test, that runs apt on a isolated file, checking >>> for results. This could be evolved into a pattern for testing apt >>> processors. >>> >>> Hope this is of interest. >>> >>> Thomas >>> >>> ------------------------------------------------------------------------- >>> Using Tomcat but need to do more? Need to support web services, security? >>> Get stuff done quickly with pre-integrated technology to make your job >>> easier >>> Download IBM WebSphere Application Server v.1.0.1 based on Apache >>> Geronimo >>> http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 >>> _______________________________________________ >>> Junit-devel mailing list >>> Jun...@li... >>> https://lists.sourceforge.net/lists/listinfo/junit-devel >>> >>> > > |