![](/img/trans.png)
[英]JUnit parameterized tests: how do I run only 1 specific test from IntelliJ/Eclipse?
[英]How to run a generic parameterized JUnit test in Eclipse?
为了避免用于简单集成测试的大量冗余测试类,我想创建一个参数化的通用测试类,如下例所示:
@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> {}
不幸的是,这个测试类是不可运行的。 有没有一种简洁的方法来实现类似的东西?
您可以使用JUnit
的Parametrized
。 它的工作原理如下:
@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}
}
);
}
}
您可以在此处阅读有关此解决方案的更多信息
还有更好的方法(我认为是这样)使用JUnitParameters
(链接),看看:
@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)
);
}
}
请注意,提供参数的方法名称必须适合测试名称。 此解决方案似乎更好,因为(不仅)您在执行后获得更好的测试名称:
[确定] JUnitParams.[0] 测试字符串 1, 1 (shouldContainNumber)
[确定] JUnitParams.[1] 测试字符串 2, 2 (shouldContainNumber)
可以在项目站点上找到更全面的为什么它更好的列表:
- 更明确 - 参数在测试方法参数中,而不是类字段
- 更少的代码 - 您不需要构造函数来设置参数
- 你可以在一个类中混合参数化和非参数化方法
- params 可以作为 CSV 字符串或从参数提供程序类传递
- 参数提供者类可以有任意多的参数提供方法,这样你就可以对不同的情况进行分组
- 你可以有一个提供参数的测试方法(不再有外部类或静态)
- 您可以在 IDE 中看到实际的参数值(在 JUnit 的参数化中,它只是连续的参数数量)
我刚刚解决了一个类似的问题,一个带有复杂参数(对象和对象列表的组合)的参数化测试,我的帮助搜索将我发送到这里。
问题中的代码和答案中的代码都应该大致有效。 考虑到 Object[][] 可以容纳任何东西,具有更简单类型的示例提供了足够的信息。 可能出现的唯一问题是正确声明复杂类型。
我不是用 Eclipse 运行测试,而是直接用 Maven 运行测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.