【发布时间】:2016-02-29 19:14:39
【问题描述】:
为了避免简单的集成测试使用大量冗余测试类,我想创建一个参数化的通用测试类,如下例所示:
@RunWith(Parameterized.class)
public class MovementTest<V extends Vehicle, T extends Track<V>> {
private final V testVehicle;
private final T testTrack;
public MovementTest(V vehicle, T track){
testVehicle = vehicle;
testTrack = track;
}
@Test
public void testMovement(){
testVehicle.moveAlong(testTrack);
}
@Parameters
public static Iterable<Object[]> provideTestExamples(){
Object[][] params = {
{ new Car(), new Highway() },
{ new Train(), new RailRoadTrack() }
};
return Arrays.asList(params);
}
}
public interface Vehicle {
void moveAlong(Track t);
}
public interface Track<E extends Vehicle> { }
public class Train implements Vehicle {
@Override
public void moveAlong(Track t) {}
}
public class RailRoadTrack implements Track<Train> {}
public class Car implements Vehicle {
@Override
public void moveAlong(Track t) { }
}
public class Highway implements Track<Car> {}
不幸的是,这个测试类是不可运行的。有没有一种简洁的方法来实现类似的东西?
【问题讨论】:
-
任何堆栈跟踪、日志等?您有 Object[][] 参数,但正在创建新的 Object[]
-
@Gaskoin 已修复。此外,Eclipse 没有提供运行该测试类的选项,因此没有堆栈跟踪。
-
eclipse JUnit 运行器将针对类型擦除的字节码运行,因此 MovementTest 具有通用类型参数并不重要。您使用的是相对较新的 eclipse 版本吗? JUnit 4 在项目路径上吗?我对 Eclipse Luna 中的参数化测试没有任何问题——即使是具有泛型类型参数的测试。
-
@KenKoster 我尝试了 Helios 和 Luna 的结果相同。但事实证明:我太习惯于让 JUnit 运行配置即席可执行文件,因为 IDE 通常会自动创建它们。我忽略的是我可以手动创建运行配置。等等,问题解决了。还是谢谢。
标签: java eclipse generics junit parameterized