在从子类进行测试之前,从JUnit基类运行测试

时间:2015-04-21 10:00:37

标签: java unit-testing inheritance junit

对于某种测试,我有一个抽象的超类和子类,它们扩展了这个超类。在超类中,我有一个名为test0IfDirectoryCopied的测试,它总是在测试子类时执行。它检查子类中设置的资源是否正确设置。

虽然这非常好,但遗憾的是,只有在子类的所有测试都已运行之后才会执行此test0IfDirectoryCopied。因为它是一种前提条件,如果在任何子类测试之前执行它将是最有帮助的。

附加信息:子类和超类都注释了@FixMethodOrder(MethodSorters.NAME_ASCENDING)test0IfDirectoryCopied按字典顺序是最小的条目

4 个答案:

答案 0 :(得分:1)

如果是前提条件您可以尝试使用@before注释来注释前置条件。 但仍然:

你可以试试Junit.contrib来做到这一点。 https://github.com/junit-team/junit.contrib/tree/master/assumes

您可以尝试定义测试套件并一个接一个地运行

您可以尝试使用testng和@dependson注释

答案 1 :(得分:1)

在不知道test0IfDirectoryCopied的细节的情况下,我认为实施可以添加到每个测试类的rule将是最佳解决方案。这允许您摆脱测试类层次结构。

答案 2 :(得分:1)

JUnit的最新版本有Assume。基本上如果假设失败,则忽略测试。

如果将其放在@Before中并且失败,则将忽略测试类中的每个测试。

import static org.junit.Assume.*;
public class TestMySubClass extends TestSuperClass{

    @Before
    public void makesureDirectoryCopied(){

       assumeTrue( directoryCopied());
   }

   ...

directoryCopied()test0ifDirectoryCopied类似,但它返回truefalse而不是抛出异常。

由于这是纯JUnit,因此不需要其他依赖项。

See Assume tutorial了解更多信息

答案 3 :(得分:0)

我找到了一个开箱即用的JUnit解决方案。我真正想要的是在整个测试类层次结构中的字典测试执行顺序(尽管也可以定义其他策略,例如总是先在基类中执行测试)。我发现最简单的方法是实现我自己的TestClassRunner:

public class LexicographicalTestOrderRunner extends BlockJUnit4ClassRunner {

    public LexicographicalTestOrderRunner(Class<?> klass) throws InitializationError {
        super(klass);
    }

    @Override
    protected List<FrameworkMethod> getChildren() {
        List<FrameworkMethod> children = super.getChildren();
        Collections.sort(children, new Comparator<FrameworkMethod>() {

            @Override
            public int compare(FrameworkMethod o1, FrameworkMethod o2) {
                return o1.getName().compareTo(o2.getName());
            }
        });

        return children;
    }
}

使用以下命令在我的基类中指定此跑步者就足够了:

@RunWith(LexicographicalTestOrderRunner.class)

作为额外的好处,我现在可以删除子类中的所有@FixMethodOrder注释。