首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Eclipse中运行通用的参数化JUnit测试?

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

Stack Overflow用户
提问于 2016-03-01 03:14:39
回答 2查看 3.2K关注 0票数 2

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

代码语言:javascript
复制
@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> {}    

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

EN

回答 2

Stack Overflow用户

发布于 2016-03-01 03:39:34

#1

你可以使用JUnitParametrized runner。它的工作方式如下:

代码语言:javascript
复制
@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)也有更好的方法(我认为是这样),只需看一看:

代码语言:javascript
复制
@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

  • you

  • 代码更少-你不需要构造函数来设置参数可以在一个类中混合参数化和非参数化的方法

  • 参数可以作为CSV字符串传递或者从参数提供者class

  • parameters提供者类可以有尽可能多的参数来提供你想要的方法,因此,您可以对不同的情况进行分组

  • 您可以有一个提供参数的测试方法(不再有外部类或静态)

  • 您可以在您的集成开发环境中查看实际参数值(在JUnit的Parametrised中,它只有连续的参数数量)
票数 2
EN

Stack Overflow用户

发布于 2020-08-01 10:29:03

我刚刚解决了一个类似的问题,一个带有复杂参数(对象和对象列表的组合)的参数化测试,我在这里寻求帮助。

问题中的代码和答案中的代码都应该大致正常。考虑到对象可以容纳任何内容,使用更简单类型的示例提供了足够的信息。可能出现的唯一问题是正确声明复杂类型。

我不是使用Eclipse运行测试,而是直接使用Maven运行测试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35707663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档