除了创建一个运行的父类之外@BeforeClass
and @AfterClass
。你可以创建一个JUnitRule https://github.com/junit-team/junit/wiki/Rules。您可以将您的规则子类化外部资源 http://junit-team.github.io/junit/javadoc/4.10/org/junit/rules/ExternalResource.html它具有可重写的方法,用于在执行(类或测试)之前和之后添加行为。
public class EmbeddedTomcatServer extends ExternalResource {
...
@Override
protected void before() throws Throwable {
EmbeddedTomcat.start();
};
@Override
protected void after() {
EmbeddedTomcat.stop();
};
}
然后在你的测试中使用@ClassRule
它运行服务器的before()
and after()
期间的方法BeforeClass
and AfterClass
time.
public class Test1 {
@ClassRule
public static EmbeddedTomcatServer tomcat = new EmbeddedTomcatServer();
//tests as normal, no more @BeforeClass or @AfterClass
}
public class Test2 {
@ClassRule
public static EmbeddedTomcatServer tomcat = new EmbeddedTomcatServer();
//tests as normal, no more @BeforeClass or @AfterClass
}
此解决方案可能比使用父类更好,因为您可以在任何测试中使用此规则,而无需更改父类。
EDIT仅运行 start() 和 stop() 一次
有点不清楚您是否意味着每个测试类运行一次启动和停止(正如您使用 @BeforeClass 和 @AfterClass 的原始代码一样)
或者,如果您只想在运行的所有测试类的所有测试中运行启动和停止一次。
如果您想做后者,@ClassRules 在这里也很有帮助。只需创建一个包含要使用的测试类的测试套件,然后仅将 ClassRule 放入套件类中
@RunWith(Suite.class)
@SuiteClasses({ Test1.class, Test2.class })
public class AllTests {
@ClassRule
public static EmbeddedTomcatServer tomcat = new EmbeddedTomcatServer();
}
这将在 AllTests 套件启动时启动 tomcat,然后在测试套件中的所有测试运行后停止 tomcat。