【发布时间】:2014-04-08 12:01:15
【问题描述】:
为了测试 REST 服务,我构建了一个基类“RestTestBase”,它可以启动嵌入式 Jetty 服务器:
class RestTestBase {
protected static AnnotationConfigWebApplicationContext rootCtx;
protected static AnnotationConfigWebApplicationContext webCtx;
private static Server jettyServer;
@BeforeClass
public static void initSpringAndJetty() {
if(jettyServer == null) {
// init jetty and spring
}
}
@AfterClass
public static void shutdownJetty() {
if(jettyServer!=null && jettyServer.isRunning()) {
// shutdown jetty and stop spring contexts
}
}
}
当我在 Eclipse IDE 的单线程环境中运行它时,一切都很好。 Jetty 和 Spring 只初始化一次,然后我的所有测试运行,然后 jetty 被关闭。
但是,当我使用 Maven Surefire 在多线程环境中运行它时,Jetty 服务器会针对每个测试重新初始化。这是为什么?
这是我的万无一失的配置:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<forkCount>0</forkCount>
<reuseForks>true</reuseForks>
</configuration>
</plugin>
</plugins>
</build>
【问题讨论】:
-
可能是因为每个实例都是在各自独立的 JVM 中启动的。
-
我没有太多的 maven/surefire 专业知识,但是知道对于每个测试用例 JUnit 实际上创建了一个自己的测试类对象可能会有所帮助。如果这个对象是分布式的,Junit 可能会为每个测试用例对象调用 @*Class 方法
-
为每个扩展此基类的具体类调用该方法。
-
@GermannArlington 我不使用分叉模式。为清楚起见,我在帖子中添加了我的万无一失的配置
-
@MarkRotteveel 是的,但仅限于万无一失。不在 Eclipse 中。这就是让我困惑的地方......
标签: java maven junit4 surefire