对于某种测试,我有一个抽象的超类和子类,它们扩展了这个超类。在超类中,我有一个名为test0IfDirectoryCopied
的测试,它总是在测试子类时执行。它检查子类中设置的资源是否正确设置。
虽然这非常好,但遗憾的是,只有在子类的所有测试都已运行之后才会执行此test0IfDirectoryCopied
。因为它是一种前提条件,如果在任何子类测试之前执行它将是最有帮助的。
附加信息:子类和超类都注释了@FixMethodOrder(MethodSorters.NAME_ASCENDING)
,test0IfDirectoryCopied
按字典顺序是最小的条目
答案 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
类似,但它返回true
或false
而不是抛出异常。
由于这是纯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
注释。