提问者:小点点

我怎么能有一个junit@Beforeclass


问题:我有一个测试套件的自定义界面。

public interface TestSuite {

  abstract void setupRestAssuredForSuite();
  abstract void restoreDatabase();
  abstract void executeSuitePreparation();
  abstract void executeSuiteTearDown();

}

如何让我的接口包含来自junit的@BeforeClass和@AfterClass注释以及我的TestSuite接口实现来确认这些?我应该完全以另一种方式这样做吗?我很想知道这样的事情是否可能与接口有关。

我需要在实现TestSuite的每个类中手动编写注释吗?或者我可以让执行套件准备();执行套件TearDown();方法在没有注释的情况下运行,因为它们以某种方式存在于TestSuite本身中,我只需要实现安装/拆卸后面的代码。

public class Foo extends Bar implements TestSuite

据我所知,@Beforeclass和@Afterclass方法必须是静态的。

这是一种愚蠢的方法吗?如果是这样,你能推荐一种不同的方法吗?


共1个答案

匿名用户

您正在尝试将接口用作混入。接口不是混入。

您能做的最好的事情可能是在您的接口中编写执行所需设置的静态方法:

public interface TestSuite {

  abstract void setupRestAssuredForSuite();
  ...


  static SomeReturn setup()
  {
      Database database = new Database();
      ...
      return database;
  }

  static void teardown(SomeType foo)
  {
      foo.reset();
  }
}

然后在您的具体实现中,您可以这样做:

public class Foo extends Bar implements TestSuite
{
    private static Foo foo;

    @BeforeClass
    public void beforeClass()
    {
        foo = TestSuite.setup();
    }

    @BeforeClass
    public void beforeClass()
    {
        TestSuite.teardown(foo);
    }
}

我强烈建议您重新考虑是否需要在测试中使用继承。对我来说,这似乎是一种代码气味,表明您的测试可能不够集中。