Tom*_*ero 17 java testing junit
我的测试类中的所有测试在@Before执行每个测试之前执行'before'方法(使用JUnit注释).
我需要一个特定的测试,不要在方法之前执行它.
有办法吗?
Mat*_*ell 22
您可以使用TestRule执行此操作.您可以使用某些描述的注释标记要跳过之前的测试,然后,在TestRule的apply方法中,您可以测试该注释并执行您想要的操作,例如:
public Statement apply(final Statement base, final Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
if (description.getAnnotation(DontRunBefore.class) == null) {
// run the before method here
}
base.evaluate();
}
};
}
Run Code Online (Sandbox Code Playgroud)
Joh*_*n B 17
考虑使用运行器@Enclosed允许您有两个内部测试类.一个用所需的@Before方法,另一个没有.
@RunWith(Enclosed.class)
public class Outer{
public static class Inner1{
@Before public void setup(){}
@Test public void test1(){}
}
public static class Inner2{
// include or not the setup
@Before public void setup2(){}
@Test public void test2(){}
}
}
Run Code Online (Sandbox Code Playgroud)
Ale*_*exR 10
不幸的是你必须编写这个逻辑.JUnit没有这样的功能.通常你有2个解决方案:
@RequiresBefore并使用此注释标记需要此项的测试.测试运行器将解析注释并决定是否运行"before"方法.第二种解决方案更清晰.第一个更简单.这取决于您选择其中一个.
这个问题很早以前就有人问过,不过我想分享一下我的解决方案:
注释所需的方法@Tag("skipBeforeEach")
在你的 setup() 方法中:
@BeforeEach
void setup(final TestInfo info) {
final Set<String> testTags = info.getTags();
if(testTags.stream()
.filter(tag->tag.equals("skipBeforeEach"))
.findFirst()
.isPresent()){
return;
}
// do your stuff
}```
Run Code Online (Sandbox Code Playgroud)