我测试过:
public class MyTest {
@Test
public void test_1(){
assertTrue(false);
}
@Test
public void test_2(){
assertTrue(false);
}
和CustomListener:
public class CustomerListener extends RunListener {
@Override
public void testFailure(Failure failure) throws Exception {
if(some_condition) {
super.testAssumptionFailure(failure);
} else {
super.testFailure(failure);
}
}
使用maven运行测试:
mvn test -Dtest=MyTest.java
CustomerListener工作但所有时间测试标记为失败('some_condition'为真)。如何使用CustomerListener将某些测试标记为跳过?
RunListener
不适合你,因为listener方法只会被JUnit调用,以通知听众发生的事件。侦听器无法干扰或停止事件本身的执行。
如果将忽略测试方法,您将需要一个可以在运行时控制的自定义JUnit运行器(如here所述):
public class MyRunner extends BlockJUnit4ClassRunner {
public MyRunner(Class<?> klass) throws InitializationError {
super(klass);
}
@Override
protected boolean isIgnored(FrameworkMethod method) {
if(method.getName().equals("test_1")) {
return true;
}
return super.isIgnored(method);
}
}
然后可以在您的测试类中使用:
@RunWith(MyRunner.class)
public class MyTest {
[...]
}
但正如khmarbaise提出的那样,使用assume
可能是更好的解决方案。
谢谢werner,但我找到了下一个解决方案
public class CusomIgnoreRule implements TestWatcher {
@Override
public Statement apply( final Statement base, final Description description ) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
try {
base.evaluate();
}
catch ( Throwable t ) {
if(some_condition) {
throw new AssumptionViolatedException("do this so our test gets marked as ignored")
}
throw t;
}
}
};
}
并在测试中:
public class MyTest {
@Rule
public CusomIgnoreRule rule = new CusomIgnoreRule();
@Test
public void test_1(){
assertTrue(false);
}
@Test
public void test_2(){
assertTrue(false);
}