问题:我有一个用于TestSuite的自定义界面。

public interface TestSuite {

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

}


如何让我的界面包含来自junit的@BeforeClass和@AfterClass批注以及我对TestSuite接口的实现,以确认它们?我应该完全用另一种方式吗?我很想知道接口是否可以实现这种功能。

我需要在实现TestSuite的每个类中手动编写注释吗?还是可以在没有注释的情况下运行executeSuitePreparation();executeSuiteTearDown();方法,因为它们以某种方式存在于TestSuite本身中,而我只需要实现设置/拆卸的代码即可。

public class Foo extends Bar implements TestSuite


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

这是解决情况的一种愚蠢的方式吗?如果是这种情况,您能推荐一种不同的方法吗?

最佳答案

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

可能最好的办法是在您的界面中编写静态方法以完成所需的设置:

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


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

10-06 09:03