JUnit 4.12 issue when using theory + enum type + DataPoint that contains a null
"willmcqueen" <[email protected]> Thu, 02 May 2013 00:59:45 -0000
| Newsgroups | gmane.comp.java.junit.user |
|---|---|
| Message-ID | <[email protected]> |
Hi,
I have a Theory with a parameter list that includes a String, a boolean, and an enum. The latter 2 should be automatically assigned and should not need any explicit @DataPoint declaration (per the release note description below. When I run the test, the enum param is assigned the null value instead of being assigned each value of the enum, and I'm not sure why this is not working for me. I would appreciate any help you can offer, please.
I cloned master from here:
https://github.com/junit-team/junit
...and looked at the JUnit 4.12 release notes:
https://github.com/junit-team/junit/wiki/4.12-release-notes
...and scrolled-down to pull request #654 which says:
"Any theory method parameters with boolean or enum types that can't be supplied with values by any other sources will be automatically supplied with default values: true and false, or every value of the given enum. If other explicitly defined values are available (e.g. from a specified ParameterSupplier or some DataPoints method in the theory class), only those explicitly defined values will be used."
On that same release notes page, I also see the comment under pull request #549, which says that a @DataPoint-annotated array field can contain null values.
So here's my test:
import org.junit.experimental.theories.DataPoints;
import org.junit.experimental.theories.Theories;
import org.junit.experimental.theories.Theory;
import org.junit.runner.RunWith;
@RunWith(Theories.class)
public class QuickTest {
@DataPoints
public static String[] platforms = new String[]{"windows", "linux", null};
public static enum JDKS {
JDK6,
JDK7,
}
@Theory
public void testFoo(String platform, boolean truth, JDKS j) throws Exception {
System.out.println(platform + ":" + truth + ":" + j);
}
}
...and here's the output:
windows:true:null
windows:false:null
linux:true:null
linux:false:null
null:true:null
null:false:null
...which is not what I expected... I expected the 3rd value to be JDK6 or JDK7. I run a 2nd test, but this time I remove the null array element from the 'platforms' field, and the results are expected:
import org.junit.experimental.theories.DataPoints;
import org.junit.experimental.theories.Theories;
import org.junit.experimental.theories.Theory;
import org.junit.runner.RunWith;
@RunWith(Theories.class)
public class QuickTest {
@DataPoints
public static String[] platforms = new String[]{"windows", "linux"};
public static enum JDKS {
JDK6,
JDK7,
}
@Theory
public void testFoo(String platform, boolean truth, JDKS j) throws Exception {
System.out.println(platform + ":" + truth + ":" + j);
}
}
...which results in:
windows:true:JDK6
windows:true:JDK7
windows:false:JDK6
windows:false:JDK7
linux:true:JDK6
linux:true:JDK7
linux:false:JDK6
linux:false:JDK7
Cool. But now just for fun, I remove the 'platform' param from testFoo and I restore the null array element to 'platforms' field. Since there is no longer any String param in the param list (and since String is a final class so there's no possibility of an assignable subclass), I expect that the 'platforms' DataPoint will just be silently ignored and I would get the expected output. But I actually see the unexpected output, as if a null array element that exists in a field (that's not even used in the Theory's param list) is affecting the values of a totally different type, the enum type (causing the enum param to receive only a null value):
import org.junit.experimental.theories.DataPoints;
import org.junit.experimental.theories.Theories;
import org.junit.experimental.theories.Theory;
import org.junit.runner.RunWith;
@RunWith(Theories.class)
public class QuickTest {
@DataPoints
public static String[] platforms = new String[]{"windows", "linux", null};
public static enum JDKS {
JDK6,
JDK7,
}
@Theory
public void testFoo(boolean truth, JDKS j) throws Exception {
System.out.println(truth + ":" + j);
}
}
...which results in:
true:null
false:null
Maybe I'm missing something?
Thank you.
Cheers,
Will
------------------------------------
Yahoo! Groups Links
<*> To visit your group on the web, go to:
http://groups.yahoo.com/group/junit/
<*> Your email settings:
Individual Email | Traditional
<*> To change settings online go to:
http://groups.yahoo.com/group/junit/join
(Yahoo! ID required)
<*> To change settings via email:
[email protected]
[email protected]
<*> To unsubscribe from this group, send an email to:
[email protected]
<*> Your use of Yahoo! Groups is subject to:
http://docs.yahoo.com/info/terms/