在调用@Before setup()后,如何反射访问测试方法?

时间:2012-08-07 11:37:55

标签: java junit

我们通过junit运行了大量的selenium测试,他们都需要在实际测试之前运行一些步骤。为此,我们有一个父TestCase类,其中包含一些@Before和@After方法。

现在,由于我们网站的一个新功能,我想参数化这个设置的一部分,我想创建一个新的注释来进行一些测试,以指示setup()方法设置是略有不同,同时允许其他人使用默认值。那么,是否可以反射性地访问即将在@Before方法中运行的测试方法?

例如

class SomeTest extends MyTestCase {

  @Test
  @Flavour(Red.class)
  public void testRedFlavouredHomepage() {
    testHomepage();
  }

  @Test
  public void testBlueFlavouredHomepage() {  // assuming Blue is my default flavour
    testHomepage();
  } 

  public void testHomepage() {
    // test some stuff
  }
}

2 个答案:

答案 0 :(得分:0)

我建议为这两种方法使用不同的测试类。

class MyTestCase {

    @Before
    public void setUp() {
        /* Default setup */
    }

    public void testHomepage() {
        // test some stuff
    }

}

class MyRedTestCase extends MyTestCase {

    @Before
    public void setUp() {
        super.setUp();
        /* Red setup */
    }

}

然后你可以将你的测试分别放到MyTestCase和MyRedTestCase扩展的两个不同的类中。

class BlueTest extends MyTestCase {

    @Test
    public void testBlueFlavouredHomepage() {  // assuming Blue is my default flavour
        testHomepage();
    } 

}

class RedTest extends MyRedTestCase {

    @Test
    public void testRedFlavouredHomepage() {
        testHomepage();
    }

}

您也可以采用其他方式,而无需引入新课程。在父类中声明一个absract(或具有默认值的具体)方法。

class MyTestCase {

    protected abstract Flour getFlour();

}

你的孩子班级将会是这样的

class SomeTest extends MyTestCase {

    private Flour flour;

    @Test
    public void testRedFlavouredHomepage() {
        flour = Flour.RED;
        testHomepage();
    }

    @Test
    public void testBlueFlavouredHomepage() {  // assuming Blue is my default flavour
        flour = Flour.BLUE;
        testHomepage();
    } 

    public void testHomepage() {
        // test some stuff
    }

    protected abstract Flour getFlour() {
        return flour;
    }

}

我会说第一种解决方案是“更清洁”;即使您必须创建其他类,也不要在一个类中包含不同类型的逻辑(例如反模式God object)。

答案 1 :(得分:0)

您可以使用@Rule(使用更高版本的JUnit> = 4.9)执行此操作。如果你有一个实现TestRule的类,特别是apply(),你可以在测试运行之前做额外的事情。 Description传递给apply方法,该方法包含方法的注释:

@Deprecated为例:

public class ExtraSetupTest {
  @Rule
  public TestRule moreSetup = new TestRule() {
    public Statement apply(Statement base, Description description) {
      return statement(base, description);
    }

    private Statement statement(final Statement base,
        final Description description) {
      return new Statement() {
        @Override
        public void evaluate() throws Throwable {
          if (description.getAnnotation(Deprecated.class) != null) {
            System.out.println("more setup here");
          }
          base.evaluate();
        }
      };
    }
  };

  @Test
  public void noExtraSetup() {
    System.out.println("noExtraSetup");
  }

  @Test
  @Deprecated
  public void withExtraSetup() {
    System.out.println("withExtraSetup");
  }
}

这产生输出:

noExtraSetup
more setup here
withExtraSetup