Skip to content

Commit 7aeb607

Browse files
committed
Fixes junit-team#1189: JUnit4TestAdapter blocks JUnit-3-style suites that are included via @RunWith(Suite.class)
1 parent 3e43555 commit 7aeb607

File tree

4 files changed

+103
-2
lines changed

4 files changed

+103
-2
lines changed

src/main/java/junit/framework/JUnit4TestAdapter.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,16 @@
1313
import org.junit.runner.manipulation.Sortable;
1414
import org.junit.runner.manipulation.Sorter;
1515

16+
/**
17+
* The JUnit4TestAdapter enables running JUnit-4-style tests using a JUnit-3-style test runner.
18+
* <p>
19+
* To use it, add the following to a test class:
20+
* <pre>
21+
public static Test suite() {
22+
return new JUnit4TestAdapter(<em>YourJUnit4TestClass</em>.class);
23+
}
24+
</pre>
25+
*/
1626
public class JUnit4TestAdapter implements Test, Filterable, Sortable, Describable {
1727
private final Class<?> fNewTestClass;
1828

src/main/java/org/junit/internal/builders/AllDefaultPossibilitiesBuilder.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,10 @@ protected JUnit3Builder junit3Builder() {
4040
}
4141

4242
protected AnnotatedBuilder annotatedBuilder() {
43-
return new AnnotatedBuilder(this);
43+
// For compatibility with Request#classes(...) and the Suite runner,
44+
// deeper nesting levels always need to support suite() methods:
45+
RunnerBuilder suiteBuilder = canUseSuiteMethod ? this : new AllDefaultPossibilitiesBuilder(true);
46+
return new AnnotatedBuilder(suiteBuilder);
4447
}
4548

4649
protected IgnoredBuilder ignoredBuilder() {

src/test/java/org/junit/tests/AllTests.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@
1818
import org.junit.runner.notification.ConcurrentRunNotifierTest;
1919
import org.junit.runner.notification.RunNotifierTest;
2020
import org.junit.runner.notification.SynchronizedRunListenerTest;
21-
import org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParametersTest;
2221
import org.junit.runners.CustomBlockJUnit4ClassRunnerTest;
2322
import org.junit.runners.Suite;
2423
import org.junit.runners.Suite.SuiteClasses;
2524
import org.junit.runners.model.FrameworkFieldTest;
2625
import org.junit.runners.model.FrameworkMethodTest;
2726
import org.junit.runners.model.TestClassTest;
27+
import org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParametersTest;
2828
import org.junit.runners.parameterized.ParameterizedNamesTest;
2929
import org.junit.runners.parameterized.TestWithParametersTest;
3030
import org.junit.tests.assertion.AssertionTest;
@@ -82,6 +82,7 @@
8282
import org.junit.tests.junit3compatibility.ForwardCompatibilityTest;
8383
import org.junit.tests.junit3compatibility.InitializationErrorForwardCompatibilityTest;
8484
import org.junit.tests.junit3compatibility.JUnit38ClassRunnerTest;
85+
import org.junit.tests.junit3compatibility.JUnit4TestAdapterTest;
8586
import org.junit.tests.junit3compatibility.OldTestClassAdaptingListenerTest;
8687
import org.junit.tests.junit3compatibility.OldTests;
8788
import org.junit.tests.junit3compatibility.SuiteMethodTest;
@@ -157,6 +158,7 @@
157158
UserStopTest.class,
158159
SortableTest.class,
159160
JUnit38ClassRunnerTest.class,
161+
JUnit4TestAdapterTest.class,
160162
SystemExitTest.class,
161163
JUnitCoreReturnsCorrectExitCodeTest.class,
162164
SuiteMethodTest.class,
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package org.junit.tests.junit3compatibility;
2+
3+
import static org.junit.Assert.assertEquals;
4+
5+
import java.util.Collections;
6+
7+
import junit.framework.JUnit4TestAdapter;
8+
import junit.framework.TestCase;
9+
import junit.framework.TestResult;
10+
import junit.framework.TestSuite;
11+
import org.junit.Test;
12+
import org.junit.runner.JUnitCore;
13+
import org.junit.runner.Result;
14+
import org.junit.runner.RunWith;
15+
import org.junit.runners.Suite;
16+
17+
public class JUnit4TestAdapterTest {
18+
19+
private static void doTest(Class<?> clazz) {
20+
// JUnit 4 runner:
21+
Result result = JUnitCore.runClasses(clazz);
22+
assertEquals(1, result.getRunCount());
23+
assertEquals(0, result.getFailureCount());
24+
assertEquals(0, result.getIgnoreCount());
25+
26+
// JUnit 3 runner:
27+
TestResult testResult = new TestResult();
28+
new JUnit4TestAdapter(clazz).run(testResult);
29+
assertEquals(1, testResult.runCount());
30+
assertEquals(0, testResult.failureCount());
31+
assertEquals(Collections.emptyList(), Collections.list(testResult.errors()));
32+
}
33+
34+
public static class Test4 {
35+
@Test
36+
public void pass() throws Exception {
37+
//pass
38+
}
39+
}
40+
41+
@RunWith(Suite.class)
42+
@Suite.SuiteClasses(Test4.class)
43+
public static class TestSuiteFor4 {
44+
}
45+
46+
@Test
47+
public void test4() {
48+
doTest(TestSuiteFor4.class);
49+
}
50+
51+
public static class Test3 extends TestCase {
52+
public void testPass() throws Exception {
53+
//pass
54+
}
55+
}
56+
57+
@RunWith(Suite.class)
58+
@Suite.SuiteClasses(Test3.class)
59+
public static class TestSuiteFor3 {
60+
}
61+
62+
@Test
63+
public void test3() {
64+
doTest(TestSuiteFor3.class);
65+
}
66+
67+
public static class TestSuite3 {
68+
public static junit.framework.Test suite() {
69+
return new TestSuite(Test3.class);
70+
}
71+
}
72+
73+
@RunWith(Suite.class)
74+
@Suite.SuiteClasses(TestSuite3.class)
75+
public static class TestSuite4ForTestSuite3 {
76+
}
77+
78+
/**
79+
* Test a JUnit-4-style test suite that contains a test
80+
* class that is a JUnit-3-style test suite.
81+
*/
82+
@Test
83+
public void testSuite4ForTestSuite3() {
84+
doTest(TestSuite4ForTestSuite3.class);
85+
}
86+
}

0 commit comments

Comments
 (0)