Unit testing 嵌套测试跑步者

Unit testing 嵌套测试跑步者,unit-testing,junit,junit4,Unit Testing,Junit,Junit4,我试图找出是否以及如何能够嵌套JUnit测试运行程序,例如,组合a、a和a 对我来说,JUnit的设计似乎不是为了轻松实现这一点,否则应该有一个方法将下一个运行程序作为参数传递 有人还实现了一个runner,在我看来,将并行和参数化结合起来是不容易的 当谷歌搜索“nested”和“JUnit”时,它会为嵌套类提供大量信息,但我要查找的是嵌套Runner,而不是类。有一种叫做NestedRunner的东西,用于在嵌套配置中运行普通的旧Java类 您的测试以@RunWith(NestedRunner

我试图找出是否以及如何能够嵌套JUnit测试运行程序,例如,组合a、a和a

对我来说,JUnit的设计似乎不是为了轻松实现这一点,否则应该有一个方法将下一个
运行程序作为参数传递

有人还实现了一个runner,在我看来,将
并行
参数化
结合起来是不容易的


当谷歌搜索“nested”和“JUnit”时,它会为嵌套类提供大量信息,但我要查找的是嵌套
Runner,而不是类。

有一种叫做NestedRunner的东西,用于在嵌套配置中运行普通的旧Java类

您的测试以@RunWith(NestedRunner.class)开始,下面是我发现的示例:

@RunWith(NestedRunner.class)
public class ListTest {

    // inner class for sharing common context
    public class WithArrayList {
        // some context for these tests
        ArrayList<String> list = new ArrayList<String>();

        public class WhenEmpty {
            @Test
            public void itIsEmpty() {
                assertTrue(list.isEmpty());
            }

            public class AfterAddingAnElement {
                // some more context for these tests
                String element = "Element";
                // you can use instance initializer to initialize your context
                // it will be run once per test
                {                            
                    // the list is still empty in here
                    assertTrue(list.isEmpty());
                    list.add(element);
                }

                @Test
                public void itIsNotEmpty() {
                    assertFalse(list.isEmpty());
                }

                @Test
                public void itContainsTheElement() {              
                    assertTrue(list.contains(element));
                }

                @Test
                public void addingAnotherElementIncreasesSize() {
                    int sizeBeforeAdding = list.size();
                    list.add("AnotherElement");
                    assertThat(list.size(), is(greaterThan(sizeBeforeAdding)));                        
                }

                @Test
                public void listSizeIsStillOne() {
                    assertThat(list.size(), is(equalTo(1)));
                }
            }

            @Test
            public void isStillEmpty() {
                assertTrue(list.isEmpty());              
            }
        }

        public class WithTwoElements {
            @Before
            public void init() {
                list.add("Element1");
                list.add("Element2");
            }

            @Test
            public void hasSizeOfTwo() {
                assertThat(list.size(), is(equalTo(2)));
            }
        }
    }
}
@RunWith(NestedRunner.class)
公共类列表测试{
//用于共享公共上下文的内部类
公共类WithArrayList{
//这些测试的一些上下文
ArrayList=新建ArrayList();
公共课时{
@试验
公共无效itIsEmpty(){
assertTrue(list.isEmpty());
}
添加元素后的公共类{
//为这些测试提供更多的上下文
String element=“element”;
//您可以使用实例初始值设定项来初始化上下文
//每次测试将运行一次
{                            
//这里的列表仍然是空的
assertTrue(list.isEmpty());
列表。添加(元素);
}
@试验
公共空间没有吸引力{
assertFalse(list.isEmpty());
}
@试验
public void它包含元素(){
assertTrue(list.contains(element));
}
@试验
public void addingAnotherlementInCreasSize(){
int sizeBeforeAdding=list.size();
列表。添加(“其他元素”);
断言(list.size(),是(大于(sizeBeforeAdding));
}
@试验
公共无效列表SizeSistillOne(){
资产(list.size(),等于(1));
}
}
@试验
public void为空(){
assertTrue(list.isEmpty());
}
}
具有两个元素的公共类{
@以前
公共void init(){
列表。添加(“元素1”);
列表。添加(“元素2”);
}
@试验
公共无效hasSizeOfTwo(){
资产(list.size(),等于(2));
}
}
}
}

下面是详细信息

此运行程序用于在嵌套类中运行测试。它不提供同时应用多个跑步者的选项。@RunWith注释需要像
@InnerRunners(GuiceJUnitRunner、ParameterizedRunner、HierarchycalContextRunner)
这样的添加来标识嵌套的运行程序。这对于链接到的NestedRunner不可用。