为了避免简单集成测试的大量冗余测试类,我想创建一个参数化的通用测试类,如下例所示:
@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> {}
不幸的是,这个测试类是不可运行的。有没有一种简洁的方法来实现类似的东西?
最佳答案
#1
您可以使用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}
}
);
}
}
您可以阅读有关此解决方案的更多信息 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.[0] test string 1, 1 (shouldContainNumber)
[OK] JUnitParams.[1] test string 2, 2 (shouldContainNumber)
可以在项目站点找到更全面的为什么它更好的列表:
- more explicit - params are in test method params, not class fields
- less code - you don't need a constructor to set up parameters
- you can mix parametrised with non-parametrised methods in one class
- params can be passed as a CSV string or from a parameters provider class
- parameters provider class can have as many parameters providing methods as you want, so that you can group different cases
- you can have a test method that provides parameters (no external classes or statics anymore)
- you can see actual parameter values in your IDE (in JUnit's Parametrised it's only consecutive numbers of parameters)
关于java - 如何在 Eclipse 中运行通用参数化 JUnit 测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35707663/