You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WebLogic部署归档WAR包时JUnit 5测试无法被发现的问题求助

问题描述

我开发了一个小型Web应用,用于调用依赖J2EE容器的JUnit 5测试,这些测试位于WAR包源码中。在WebLogic服务器上部署解压后的WAR包时,测试可正常运行;但部署归档WAR包时,测试运行器始终无法发现测试,仅返回JUnit无法识别归档内测试的错误。请问有人遇到过类似问题或成功实现归档部署的方案吗?

错误截图

JUnit无法识别归档内测试的错误截图

核心代码

protected static final String JUNIT_REPORTING_FILE_NAME = "TEST-junit-jupiter.xml";
public TestSuiteResponse runSuite(String packageName) {
  TestSuiteResponse response = new TestSuiteResponse();
  checkArgument(StringUtil.isNotEmpty(packageName), "The 'String packageName' argument is required; it must not be null");
  try {
    LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request()
      .selectors(selectPackage(packageName))
      .filters(includeClassNamePatterns(STANDARD_INCLUDE_PATTERN))
    .build();
    Launcher launcher = LauncherFactory.create();
    launcher.discover(request);
    SummaryGeneratingListener summaryGeneratingListener = new SummaryGeneratingListener();
    String tmpDir = domainHelperService.getTmpDir();
    Path reportPath = Path.of(tmpDir, "myTestResults");
    LegacyXmlReportGeneratingListener reportGeneratingListener = new LegacyXmlReportGeneratingListener(reportPath, new PrintWriter(System.out));
    launcher.registerTestExecutionListeners(summaryGeneratingListener, reportGeneratingListener);
    launcher.execute(request);
    TestExecutionSummary summary = summaryGeneratingListener.getSummary();
    response.setReportPath(Path.of(reportPath.toString(), JUNIT_REPORTING_FILE_NAME).toString());
    TestSuiteResponseDtos.TestExecutionSummary testExecutionSummaryDto = toTestExecutionSummaryDto(summary);
    response.setTestExecutionSummary(testExecutionSummaryDto);
    logger.info("response={}", response);
  } catch (Exception e) {
    logger.error(null, e);
    throw new RuntimeException(e);
  }
  return response;
}
解决方案参考

1. 适配归档环境的类扫描逻辑

JUnit 5默认的包扫描依赖文件系统路径,归档WAR内的资源通过JarURLConnection访问,无法被默认扫描器识别。可以:

  • 自定义类扫描逻辑,通过当前上下文类加载器枚举指定包下的类,处理JarURL场景,再将获取到的测试类直接传递给JUnit的selectClass选择器。
  • 示例代码片段:
// 实现从类加载器扫描包内类的方法
List<Class<?>> testClasses = scanClassesFromPackage(packageName, Thread.currentThread().getContextClassLoader());
// 替换包选择器为类选择器
LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request()
  .selectors(testClasses.stream().map(DiscoverySelectors::selectClass).toArray(DiscoverySelector[]::new))
  .filters(includeClassNamePatterns(STANDARD_INCLUDE_PATTERN))
.build();

2. 调整WebLogic类加载配置

WebLogic归档部署时的类加载隔离可能导致JUnit无法访问测试类,可在weblogic.xml中添加配置:

<container-descriptor>
  <prefer-web-inf-classes>true</prefer-web-inf-classes>
  <prefer-application-packages>
    <package-name>org.junit.jupiter.*</package-name>
    <package-name>你的测试类所在根包.*</package-name>
  </prefer-application-packages>
</container-descriptor>

同时确认测试类已被正确打包到WAR的WEB-INF/classes或WEB-INF/lib中,未被构建脚本排除。

3. 临时解压测试类到文件系统

在测试执行前,将WAR内的测试类目录解压到WebLogic临时目录,让JUnit扫描文件系统路径:

  • 使用JarFile工具读取WAR包,将WEB-INF/classes/目标测试包解压到domainHelperService.getTmpDir()下的临时文件夹。
  • 修改JUnit扫描逻辑,指向解压后的目录路径而非原始包名。

内容的提问来源于stack exchange,提问作者JohnZ1385

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 07:35:41