使用 maven-surefire 插件时如何使同步工作?

How to make synchronized work when using maven-surefire plugin?

我正在使用 maven-surefire 插件并行执行 Cucumber Runner。在每个 Runners 中,我都在调用 Utilities class 的同步静态方法。但是并行的所有 Runners 运行 都能够以非同步的方式调用该方法。

@RunWith(CucumberWithSerenity.class)
@CucumberOptions(...)

public class SampleRunner {

    @BeforeClass
    public static void loadLocators() {
            Utilities.doSomething();
        }
}
public class Utilities {

    public synchronized static void doSomething() {
       System.out.println("Start");
       .
       .
       .
       System.out.println("Stop");
    }
}

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.0.0-M3</version>
    <configuration>
    <includes>
        <include>**/*Runner.java</include>               
    </includes> 
    <parallel>classes</parallel>
    <threadCount>${parallel.tests}</threadCount>
    <forkCount>${parallel.tests}</forkCount>
    <perCoreThreadCount>true</perCoreThreadCount>  
<!--    <skip>true</skip>  -->
    </configuration>    
</plugin>

当我的 threadCount 为 3 时,执行 mvn clean verify serenity:aggregate 我得到以下日志

Start
Start
Stop
Stop
Start
Stop

我期待的是

Start
Stop
Start
Stop
Start
Stop

forkCount 设置为 1,插件将仅使用 1 个 JVM 来执行测试。如果超过 1,则将使用多个 JVM,因此将使用不同的 synchronized static 方法。

参考:https://maven.apache.org/surefire/maven-surefire-plugin/examples/fork-options-and-parallel-execution.html