繁体   English   中英

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

[英]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> {}    

不幸的是,这个测试类是不可运行的。 有没有一种简洁的方法来实现类似的东西?

#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}
                }
        );
    }
}

您可以在此处阅读有关此解决方案的更多信息

#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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM