繁体   English   中英

在调用@Before setup()之后,如何反射地访问要运行的测试方法?

[英]How can I reflectively access the test method to run after a call to @Before setup()?

我们有很多通过junit运行的硒测试,并且它们都有一些实际测试之前需要运行的步骤。 为此,我们有一个父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
  }
}

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

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扩展的2个不同的类中。

class BlueTest extends MyTestCase {

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

}

class RedTest extends MyRedTestCase {

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

}

您也可以采用另一种方式来做,而无需引入新的类。 在父类中声明一个抽象方法(或带有默认值的具体方法)。

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;
    }

}

我会说第一种解决方案是“更清洁”。 即使您需要创建额外的类,你不包括不同类型的一个类(如在反模式的逻辑神的对象 )。

您可以使用@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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM