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());
}
...