Skip to content

Commit 2ade5fd

Browse files
committed
Changed AllMembersSupplier to call single-valued methods at parameter assignment time, not parameter use time.
1 parent e012e06 commit 2ade5fd

File tree

4 files changed

+46
-85
lines changed

4 files changed

+46
-85
lines changed

src/main/java/org/junit/experimental/theories/internal/AllMembersSupplier.java

Lines changed: 5 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -19,34 +19,6 @@
1919
* Supplies Theory parameters based on all public members of the target class.
2020
*/
2121
public class AllMembersSupplier extends ParameterSupplier {
22-
static class MethodParameterValue extends PotentialAssignment {
23-
private final FrameworkMethod fMethod;
24-
25-
private MethodParameterValue(FrameworkMethod dataPointMethod) {
26-
fMethod = dataPointMethod;
27-
}
28-
29-
@Override
30-
public Object getValue() throws CouldNotGenerateValueException {
31-
try {
32-
return fMethod.invokeExplosively(null);
33-
} catch (IllegalArgumentException e) {
34-
throw new RuntimeException(
35-
"unexpected: argument length is checked");
36-
} catch (IllegalAccessException e) {
37-
throw new RuntimeException(
38-
"unexpected: getMethods returned an inaccessible method");
39-
} catch (Throwable e) {
40-
throw new CouldNotGenerateValueException();
41-
// do nothing, just look for more values
42-
}
43-
}
44-
45-
@Override
46-
public String getDescription() throws CouldNotGenerateValueException {
47-
return fMethod.getName();
48-
}
49-
}
5022

5123
private final TestClass fClass;
5224

@@ -83,7 +55,11 @@ private void addSinglePointMethods(ParameterSignature sig,
8355
List<PotentialAssignment> list) {
8456
for (FrameworkMethod dataPointMethod : getSingleDataPointMethods(sig)) {
8557
if (sig.canAcceptType(dataPointMethod.getType())) {
86-
list.add(new MethodParameterValue(dataPointMethod));
58+
try {
59+
list.add(PotentialAssignment.forValue(dataPointMethod.getName(), dataPointMethod.invokeExplosively(null)));
60+
} catch (Throwable e) {
61+
// ignore and move on
62+
}
8763
}
8864
}
8965
}
Lines changed: 25 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,42 @@
11
package org.junit.tests.experimental.theories;
22

3+
import static org.junit.tests.experimental.theories.TheoryTestUtils.runTheoryClass;
34
import org.junit.Assert;
45
import org.junit.Assume;
56
import org.junit.Test;
67
import org.junit.experimental.theories.DataPoint;
78
import org.junit.experimental.theories.Theories;
89
import org.junit.experimental.theories.Theory;
9-
import org.junit.runner.JUnitCore;
10-
import org.junit.runner.Request;
1110
import org.junit.runner.Result;
1211
import org.junit.runner.RunWith;
13-
import org.junit.runner.Runner;
1412
import org.junit.runners.model.InitializationError;
1513

1614
@RunWith(Theories.class)
1715
public class AssumingInTheoriesTest {
1816

19-
@Test
20-
public void noTheoryAnnotationMeansAssumeShouldIgnore() {
21-
Assume.assumeTrue(false);
22-
}
23-
24-
@Test
25-
public void theoryMeansOnlyAssumeShouldFail() throws InitializationError {
26-
JUnitCore junitRunner = new JUnitCore();
27-
Runner theoryRunner = new Theories(TheoryWithNoUnassumedParameters.class);
28-
Request request = Request.runner(theoryRunner);
29-
Result result = junitRunner.run(request);
30-
Assert.assertEquals(1, result.getFailureCount());
31-
}
32-
33-
/**
34-
* Simple class that SHOULD fail because no parameters are met.
35-
*/
36-
public static class TheoryWithNoUnassumedParameters {
37-
38-
@DataPoint
39-
public final static boolean FALSE = false;
40-
41-
@Theory
42-
public void theoryWithNoUnassumedParameters(boolean value) {
43-
Assume.assumeTrue(value);
44-
}
45-
}
17+
@Test
18+
public void noTheoryAnnotationMeansAssumeShouldIgnore() {
19+
Assume.assumeTrue(false);
20+
}
21+
22+
@Test
23+
public void theoryMeansOnlyAssumeShouldFail() throws InitializationError {
24+
Result result = runTheoryClass(TheoryWithNoUnassumedParameters.class);
25+
Assert.assertEquals(1, result.getFailureCount());
26+
}
27+
28+
/**
29+
* Simple class that SHOULD fail because no parameters are met.
30+
*/
31+
public static class TheoryWithNoUnassumedParameters {
32+
33+
@DataPoint
34+
public final static boolean FALSE = false;
35+
36+
@Theory
37+
public void theoryWithNoUnassumedParameters(boolean value) {
38+
Assume.assumeTrue(value);
39+
}
40+
}
4641

4742
}

src/test/java/org/junit/tests/experimental/theories/TheoryTestUtils.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,13 @@
44
import java.util.List;
55

66
import org.junit.experimental.theories.PotentialAssignment;
7+
import org.junit.experimental.theories.Theories;
78
import org.junit.experimental.theories.internal.Assignments;
9+
import org.junit.runner.JUnitCore;
10+
import org.junit.runner.Request;
11+
import org.junit.runner.Result;
12+
import org.junit.runner.Runner;
13+
import org.junit.runners.model.InitializationError;
814
import org.junit.runners.model.TestClass;
915

1016
public final class TheoryTestUtils {
@@ -17,5 +23,11 @@ public static List<PotentialAssignment> potentialAssignments(Method method)
1723
new TestClass(method.getDeclaringClass()))
1824
.potentialsForNextUnassigned();
1925
}
26+
27+
public static Result runTheoryClass(Class<?> testClass) throws InitializationError {
28+
Runner theoryRunner = new Theories(testClass);
29+
Request request = Request.runner(theoryRunner);
30+
return new JUnitCore().run(request);
31+
}
2032

2133
}

src/test/java/org/junit/tests/experimental/theories/runner/WithDataPointMethod.java

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,26 @@
55
import static org.hamcrest.CoreMatchers.is;
66
import static org.hamcrest.CoreMatchers.not;
77
import static org.hamcrest.CoreMatchers.nullValue;
8+
import static org.junit.Assert.assertEquals;
89
import static org.junit.Assert.assertThat;
910
import static org.junit.experimental.results.PrintableResult.testResult;
1011
import static org.junit.experimental.results.ResultMatchers.isSuccessful;
1112
import static org.junit.tests.experimental.theories.TheoryTestUtils.potentialAssignments;
1213

13-
import java.util.ArrayList;
1414
import java.util.Date;
1515
import java.util.List;
1616

1717
import org.hamcrest.Matcher;
1818
import org.junit.Test;
1919
import org.junit.experimental.theories.DataPoint;
20+
import org.junit.experimental.theories.DataPoints;
2021
import org.junit.experimental.theories.Theories;
2122
import org.junit.experimental.theories.Theory;
2223
import org.junit.runner.JUnitCore;
2324
import org.junit.runner.RunWith;
2425
import org.junit.runner.notification.Failure;
26+
import org.junit.runners.model.InitializationError;
27+
import org.junit.tests.experimental.theories.TheoryTestUtils;
2528

2629
public class WithDataPointMethod {
2730
@RunWith(Theories.class)
@@ -65,31 +68,6 @@ public void ignoreExceptionsFromDataPointMethods() {
6568
assertThat(testResult(HasUglyDataPointMethod.class), isSuccessful());
6669
}
6770

68-
@RunWith(Theories.class)
69-
public static class DataPointMethodReturnsMutableObject {
70-
@DataPoint
71-
public static List<Object> empty() {
72-
return new ArrayList<Object>();
73-
}
74-
75-
@DataPoint
76-
public static int ONE = 1;
77-
78-
@DataPoint
79-
public static int TWO = 2;
80-
81-
@Theory
82-
public void everythingsEmpty(List<Object> first, int number) {
83-
assertThat(first.size(), is(0));
84-
first.add("a");
85-
}
86-
}
87-
88-
@Test
89-
public void mutableObjectsAreCreatedAfresh() {
90-
assertThat(failures(DataPointMethodReturnsMutableObject.class), empty());
91-
}
92-
9371
@RunWith(Theories.class)
9472
public static class HasDateMethod {
9573
@DataPoint

0 commit comments

Comments
 (0)