1

我有一个以并发模式运行的 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
4

0 回答 0