java - 如何在 Eclipse 中运行通用参数化 JUnit 测试?

标签 java eclipse generics junit parameterized

为了避免简单集成测试的大量冗余测试类,我想创建一个参数化的通用测试类,如下例所示:

@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

您可以使用JUnitParametrized 运行程序。它的工作原理如下:

@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/

相关文章:

java - 如何从 MongoRepository/QueryDSL 获取不同的字段?

java - 如何在 fragment 上设置整个应用程序的主题?

java - Eclipse 将包组织到文件夹层次结构中

java - 泛型类型函数的返回语句错误

java - 尝试计算时间差来比较两种排序算法

java - Axis HTTP 与 Axis HTTPS 代理设置

java - Android SDK Eclipse 谷歌地图

java - Intellij IDEA : equivalent of Eclipse's "Complete Current Statement" (Ctrl+Shift+Enter)?

java - 我应该如何转换具有多个边界的 Java 泛型?

.net - 非统一实例化的用法是什么意思?