在诉讼中为每个测试调用@Before和@After方法

时间:2014-10-13 15:49:06

标签: java testing junit automated-tests

我的所有测试都有班长:

import org.junit.*;
import org.junit.rules.TestName;
import org.junit.rules.TestRule;
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;
import org.junit.runner.Result;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;

import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.List;

@RunWith(Suite.class)
@Suite.SuiteClasses({

   Test1.class,
   Test2.class,
   Test3.class,
   Test4.class,
   Test5.class
})

public class AllTestRunner {
   ...
@Before
public void method1() {}

@After 
public void method2() {}

我需要为来自method1()的每个班级中的每个method2()投放@TestSuiteClasses。 但它不起作用,可能是我做的。错?

感谢您的帮助,对不起我的英语。

3 个答案:

答案 0 :(得分:1)

首先,创建一个抽象类BasicTest:

//
    @Rule
    public TestWatcher watcher = new TestWatcher() {

        @Override
        protected void starting(Description description) {
        }

        @Override
        protected void succeeded(Description description) {
        }

        @Override
        protected void failed(Throwable e, Description description) {
        }

        @Override
        protected void skipped(AssumptionViolatedException e, Description description) {
        }

        @Override
        public void finished(Description description) {
        }
    };
//...

对于每个测试类:

public class Test extends BasicTest { }

因此,每个@Test将被称为TestWatcher的方法。

答案 1 :(得分:0)

这是因为@Before@After@BeforeClass@AfterClass是依赖于类的。换句话说,它们只涉及它们所定义的类别。

对不起,没有办法实现您尝试使用这些注释实现的目标。您必须在每个SuiteClasses中复制您的方法

答案 2 :(得分:0)

或者,您可以使用规则。此方法的优势在于您不需要继承某个类。

在一个类中,您实现了一个规则,该规则指定在测试用例执行之前和之后要执行的行为。

public class MyRule implements MethodRule {
  public Statement apply(final Statement statement, final FrameworkMethod frameworkMethod, final Object o) {
    return new Statement() {
        @Override
        public void evaluate() throws Throwable {
            try {
                before();
                statement.evaluate();
            } finally {
                after();
            }
        }
    };
  }

  protected void before() {
    System.out.println("before");
  }

  public void after() {
    System.out.println("after");
  }
}

然后,您可以在应该使用它的每个测试类中实例化规则。不需要继承。

public class TestClass {

  @Rule
  public MyRule myRule = new MyRule();

  @Test
  public void test() {
  }
}