【问题标题】:Why is my @AfterClass method called multiple times?为什么我的@AfterClass 方法被多次调用?
【发布时间】: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


【解决方案1】:

好的,看起来这个问题有点没抓住重点,因为@BeforeClass 和@AfterClass 的行为符合预期。

我添加了一个后续问题来解决我的实际问题:

How can I initialize a Spring applicationContext just once for all tests

【讨论】:

    猜你喜欢
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多