为了避免很多冗余测试类进行简单的集成测试,我想创建一个参数化的通用测试类,如下例所示:
@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 {
abstract 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> {}
不幸的是,这个测试类不可运行。是否有一种简洁的方法来实现类似的东西?
答案 0 :(得分:3)
您可以使用JUnit
的{{1}}亚军。它的工作原理如下:
Parametrized
您可以详细了解此解决方案here
使用@RunWith(Parameterized.class)
public class ParametrizedTest {
private final String text;
private final int number;
public ParametrizedTest(String text, int number) {
this.text = text;
this.number = number;
}
@Test
public void shouldContainNumber() {
assertTrue(text.contains(String.valueOf(number)));
}
@Parameterized.Parameters
public static Iterable<Object[]> params() {
return Arrays.asList(
new Object[][]{
{"test string 1", 1},
{"test string 2", 2}
}
);
}
}
(link)还有更好的方式(我认为是这样),请看一下:
JUnitParameters
请注意,提供参数的方法名称必须符合测试名称。这个解决方案似乎更好,因为(不仅)你在执行后得到更好的测试名称:
[OK] JUnitParams。[0]测试字符串1,1(shouldContainNumber)
[OK] JUnitParams。[1]测试字符串2,2(shouldContainNumber)
可以在项目现场找到更全面的为什么更好的列表:
- 更明确 - params在测试方法参数中,而不是类字段
- 更少的代码 - 您不需要构造函数来设置参数
- 您可以将参数化与非参数化方法混合在一个类
中- params可以作为CSV字符串或参数提供程序类
传递- 参数提供程序类可以根据需要提供尽可能多的参数,以便您可以对不同的情况进行分组
- 您可以拥有一个提供参数的测试方法(不再需要外部类或静态)
- 您可以在IDE中看到实际的参数值(在JUnit的Parametrised中它只是连续的参数数量)
答案 1 :(得分:0)
我刚刚解决了一个类似的问题,即使用复杂参数(对象和对象列表的组合)进行参数化测试,而我对帮助的寻求将我送到了这里。
问题代码和答案代码都应该可以正常工作。考虑到Object [] []将容纳任何内容,具有简单类型的示例提供了足够的信息。可能出现的唯一问题是正确声明复杂类型。
我不是在Eclipse中运行测试,而是在Maven中直接运行。