Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在从子类进行测试之前,先从JUnit基类运行测试_Java_Unit Testing_Inheritance_Junit - Fatal编程技术网

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

Java 在从子类进行测试之前,先从JUnit基类运行测试,java,unit-testing,inheritance,junit,Java,Unit Testing,Inheritance,Junit,对于某种测试,我有一个抽象的超类和扩展这个超类的子类。在超类中,我有一个名为test0IfDirectoryCopied的测试,它总是在测试子类时执行。它检查子类中设置的资源是否正确设置 虽然这很好,但不幸的是,只有在子类的所有测试都运行之后,才会执行此test0IfDirectoryCopied。因为它是一种先决条件,所以如果在任何子类测试之前执行它,将非常有帮助 附加信息:子类和超类都用@FixMethodOrder(MethodSorters.NAME\u升序)注释,test0IfDire

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

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


附加信息:子类和超类都用
@FixMethodOrder(MethodSorters.NAME\u升序)
注释,
test0IfDirectoryCopied
是词典中最小的条目

如果它是一个先决条件,您可以尝试用@before注释先决条件。 但仍然:

你可以试试Junit.contrib来做。

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


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

我找到了一个可以直接使用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;
    }
}

另外一个好处是,我现在可以删除子类中的所有
@FixMethodOrder
注释。

在不了解
test0IfDirectoryCopied
的详细信息的情况下,我认为实现一个可以添加到每个测试类中的方法将是最好的解决方案。这也允许您摆脱测试类层次结构。

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

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

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

    @Before
    public void makesureDirectoryCopied(){

       assumeTrue( directoryCopied());
   }

   ...
其中
directoryCopied()
与您的
test0ifDirectoryCopied
类似,只是它返回
true
false
,而不是抛出异常

因为这是纯JUnit,所以不需要额外的依赖项


有关更多信息,请参见在每个测试方法之前执行

,这不是我想要的
@beforeClass
不起作用,因为此时,我的资源尚未设置。此外,我希望将
test0IfDirectoryCopied
作为正常测试执行,而上述两种测试都不这样做。我不知道如何使用TestSuite来获得所需的行为。我不想向testng添加依赖项。contrib的
@假设
做了我想要的事情。但是,我也不想在Junit.contrib.Well中添加依赖项,当使用testng时,我可以在子类中声明一个默认构造函数,以便来自父类的测试在我的子类之前运行。它对junit也有效吗?非常好的答案。非常感谢。
import static org.junit.Assume.*;
public class TestMySubClass extends TestSuperClass{

    @Before
    public void makesureDirectoryCopied(){

       assumeTrue( directoryCopied());
   }

   ...