尝试将泛型与JUnit 4理论混合使用时遇到一个奇怪的错误。我的代码如下。我基本上想做的是编写一种方法来测试可比较接口的子类型。即使该方法可以接受任何可比较的子类型,但一次只能测试一个子类型(因此,Strings和Integers(Comparable的两个子类型)都不能一起测试)。
仅作为参考,这是一个明确要求使用Theories和泛型的赋值,因此我不能使用JUnit的其他部分,也不能忽略泛型的使用。
@RunWith(Theories.class)
public class ComparableTheory{
@DataPoints public static String[] stringPoints() {
return new String[] {
"abc",
"acc"
};
}
@DataPoints public static String[] stringPoints2() {
return new String[] {
"xyz",
"mno"
};
}
@DataPoints public static Integer[] integerPoints() {
return new Integer[] {
1, 2, 3
};
}
@Theory
public <T extends Comparable> void comparableTransitiveTheory(T a, T b, T c) {
assumeTrue (Math.signum(a.compareTo(b)) == Math.signum(b.compareTo(c)));
assertTrue (Math.signum(a.compareTo(c)) == Math.signum(a.compareTo(b)));
}
}
我收到的错误如下:
JUnit version 4.13-beta-2
.E
Time: 0.002
There was 1 failure:
1) initializationError(ComparableTheory)
org.junit.runners.model.InvalidTestClassError: Invalid test class 'ComparableTheory':
1. Method comparableTransitiveTheory() contains unresolved type variable T
2. Method comparableTransitiveTheory() contains unresolved type variable T
3. Method comparableTransitiveTheory() contains unresolved type variable T
at org.junit.runners.ParentRunner.validate(ParentRunner.java:511)
at org.junit.runners.ParentRunner.<init>(ParentRunner.java:91)
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:74)
at org.junit.experimental.theories.Theories.<init>(Theories.java:73)
FAILURES!!!
Tests run: 1, Failures: 1
作为参考,我正在运行并使用以下命令进行编译:
javac -cp .:"*" ComparableTheory.java
java -cp .:"*" org.junit.runner.JUnitCore ComparableTheory
文件hamcrest-2.1.jar
和junit-4.13-beta-2.jar
在我的工作目录中(因此在我的类路径中)。