为了避免大量冗余的测试类用于简单的集成测试,我想创建一个参数化的通用测试类,如下所示:
@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> {} 不幸的是,这个测试类是不可运行的。有没有一种简明的方法来实现类似的东西?
发布于 2016-03-01 03:39:34
#1
你可以使用JUnit的Parametrized runner。它的工作方式如下:
@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}
}
);
}
}您可以阅读有关此解决方案here的更多信息
#2 (更好)
使用JUnitParameters (link)也有更好的方法(我认为是这样),只需看一看:
@RunWith(JUnitParamsRunner.class)
public class JUnitParamsTest{
@Test
@Parameters
public void shouldContainNumber(String text, int number) {
assertTrue(text.contains(String.valueOf(number)));
}
public Object[] parametersForShouldContainNumber() {
return $(
$("test string 1", 1),
$("test string 2", 2)
);
}
}请注意,提供参数的方法的名称必须符合测试名称。这个解决方案似乎更好,因为(不仅)您在执行后可以获得更好的测试名称:
OK JUnitParams。测试字符串1,1 (shouldContainNumber)
OK JUnitParams.1测试字符串2,2 (shouldContainNumber)
更全面的为什么它更好的列表可以在项目网站上找到:
参数更显式-参数在测试方法参数中,而不是类字段中- parameters
发布于 2020-08-01 10:29:03
我刚刚解决了一个类似的问题,一个带有复杂参数(对象和对象列表的组合)的参数化测试,我在这里寻求帮助。
问题中的代码和答案中的代码都应该大致正常。考虑到对象可以容纳任何内容,使用更简单类型的示例提供了足够的信息。可能出现的唯一问题是正确声明复杂类型。
我不是使用Eclipse运行测试,而是直接使用Maven运行测试。
https://stackoverflow.com/questions/35707663
复制相似问题