我有测试:
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将某些测试标记为跳过?
答案 0 :(得分:0)
RunListener
对你不起作用,因为listener方法只会被JUnit调用,以通知听众发生的事件。侦听器无法干扰或停止事件本身的执行。
如果将忽略测试方法(如here所述),您需要一个可以在运行时控制的自定义JUnit运行器:
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
可能是更好的解决方案。
答案 1 :(得分:0)
谢谢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);
}