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

时间:2016-02-29 19:14:39

标签: 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 {
    abstract 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> {}    

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

2 个答案:

答案 0 :(得分:3)

#1

您可以使用JUnit的{​​{1}}亚军。它的工作原理如下:

Parametrized

您可以详细了解此解决方案here

#2(更好)

使用@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} } ); } } link)还有更好的方式(我认为是这样),请看一下:

JUnitParameters

请注意,提供参数的方法名称必须符合测试名称。这个解决方案似乎更好,因为(不仅)你在执行后得到更好的测试名称:

  

[OK] JUnitParams。[0]测试字符串1,1(shouldContainNumber)

     

[OK] JUnitParams。[1]测试字符串2,2(shouldContainNumber)

可以在项目现场找到更全面的为什么更好的列表:

  
      
  • 更明确 - params在测试方法参数中,而不是类字段
  •   
  • 更少的代码 - 您不需要构造函数来设置参数
  •   
  • 您可以将参数化与非参数化方法混合在一个类
  • 中   
  • params可以作为CSV字符串或参数提供程序类
  • 传递   
  • 参数提供程序类可以根据需要提供尽可能多的参数,以便您可以对不同的情况进行分组
  •   
  • 您可以拥有一个提供参数的测试方法(不再需要外部类或静态)
  •   
  • 您可以在IDE中看到实际的参数值(在JUnit的Parametrised中它只是连续的参数数量)
  •   

答案 1 :(得分:0)

我刚刚解决了一个类似的问题,即使用复杂参数(对象和对象列表的组合)进行参数化测试,而我对帮助的寻求将我送到了这里。

问题代码和答案代码都应该可以正常工作。考虑到Object [] []将容纳任何内容,具有简单类型的示例提供了足够的信息。可能出现的唯一问题是正确声明复杂类型。

我不是在Eclipse中运行测试,而是在Maven中直接运行。