我有一个以并发模式运行的 Maven/Junit 测试项目。每个测试用例都使用 SoapUI API 调用一个 Web 服务:
public void makeWebServiceCall(String testCaseName) {
SoapUI.setSoapUICore( new StandaloneSoapUICore(true) );
WsdlProject project = new WsdlProject("mySoapUiProject.xml");
WsdlTestSuite testSuite = project.getTestSuiteByName("myTestSuite");
WsdlTestCase testCase = testSuite.getTestCaseByName(testCaseName);
WsdlTestCaseRunner testCaseRunner = testCase.run(new PropertiesMap(), false);
...
}
经过多次调试,我发现语句
SoapUI.setSoapUICore( new StandaloneSoapUICore(true) );
通常会导致执行调用的 Junit 线程结束,测试用例的其余部分由稍后的线程完成。发生这种情况时,原始线程的资源不会被正确释放,并且后续完成代码的线程会按顺序为每个中断的线程执行此操作,因此会失去并发执行的好处。
我无法找到任何有关此 SoapUI.setSoapUICore 方法的作用或它可能导致 Junit 线程退出的原因的文档。我猜这可能是资源锁定问题,因为 setSoapUICore 是一种静态方法。但是我尝试过同步soapUI代码,以便一次只有一个线程可以执行它并且问题仍然存在。
因此,我将调用放在类的静态初始化块中,以便它只被调用一次:
static {
SoapUI.setSoapUICore( new StandaloneSoapUICore(true) );
}
这似乎已经解决了这个问题,但我想知道这个方法正在做什么,这可能会导致 Junit 线程结束,因此,如果上述“修复”确实是一个可行的解决方案。
我正在使用以下资源:
- Maven 3.6.1
- Maven Surefire 3.0.0-M4
- Junit-木星 5.7.0-M1
- Java 13.0.1
- SoapUI 5.5.0