Java 混合参数化和编程单元测试

Java 混合参数化和编程单元测试,java,junit,parameterized,Java,Junit,Parameterized,使用JUnit,您可以使用@RunWith(Parameterized.class)提供一组参数传递给测试构造函数,然后对每个对象运行测试 我试图将尽可能多的测试逻辑转换成数据,但有些测试不容易转换成数据驱动的测试。有没有一种方法可以使用JUnit的参数化的运行程序运行一些带有参数的测试,然后还可以添加非数据驱动的测试,这些测试不会在每个测试对象构造中重复运行?我的解决方法是创建一个类,并将编程测试和数据驱动测试放在两个单独的子类中。子类必须是静态的,JUnit才能运行其测试。这里有一个骨架:

使用JUnit,您可以使用
@RunWith(Parameterized.class)
提供一组参数传递给测试构造函数,然后对每个对象运行测试


我试图将尽可能多的测试逻辑转换成数据,但有些测试不容易转换成数据驱动的测试。有没有一种方法可以使用JUnit的
参数化的
运行程序运行一些带有参数的测试,然后还可以添加非数据驱动的测试,这些测试不会在每个测试对象构造中重复运行?

我的解决方法是创建一个类,并将编程测试和数据驱动测试放在两个单独的子类中。子类必须是静态的,JUnit才能运行其测试。这里有一个骨架:

@RunWith(Enclosed.class) // needed for working well with Ant
public class MyClassTests {
    public static class Programmatic {
        @Test
        public void myTest(){
            // test something here
        }
    }

    @RunWith(Parameterized.class)
    public static class DataDriven {
        @Parameters
        public static Collection<Object[]> getParams() {
            return Collections.emptyList();
        }

        private String data;
        public DataDriven(String testName, String data){
            this.data = data;
        }
        @Test
        public void test() throws AnalyzeExceptionEN{
            // test data string here
        }
    }
}
@RunWith(Enclosed.class)//与Ant良好协作所需
公共类MyClassTests{
公共静态类{
@试验
公共无效myTest(){
//在这里测试一下
}
}
@RunWith(参数化的.class)
公共静态类数据驱动{
@参数
公共静态集合getParams(){
返回集合。emptyList();
}
私有字符串数据;
公共数据驱动(字符串测试名、字符串数据){
这个数据=数据;
}
@试验
public void test()抛出分析异常{
//这里是测试数据字符串
}
}
}

一种方法是使用Junit的
封闭的
运行程序。它非常冗长,但也非常强大。它允许您将多个不同的跑步者合并到一个文件中

另一个选项是使用自定义junit runner。佐哈克当然支持。小提取物:

@RunWith(ZohhakRunner.class)
public class CoercingTest {

    @TestWith("ONE_OF_ENUM_VALUES")
    public void should_coerce_enum(SampleEnum param) {
        assertThat(param).isEqualTo(SampleEnum.ONE_OF_ENUM_VALUES);     
    }

    @Test
    public void should_run_standard_junit_test() {
        //this will also work
    }
}

如果这对你来说还不够,你肯定可以找到其他支持这两种测试的跑步者。

有两个测试课程有什么不对?一个是参数化的,一个是非参数化的?我宁愿在一个测试中测试一个类,而不是创建“MyClassDataDrivenTest”和“MyClassProgrammaticTest”。