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

CentOS7编译WhereHows时wherehows-common测试报错:任务数量不符

解决WhereHows编译时JobsUtilTest.testGetEnabledJobs断言失败问题

我之前在CentOS7上编译WhereHows的时候,也碰到过类似的Gradle测试读取到额外配置的坑,咱们来一步步解决这个问题:

问题复盘

在执行wherehows-common:test任务时,JobsUtilTest.testGetEnabledJobs方法断言失败:预期读取到2个job配置,但实际读到了47个,其中包含大量重复的测试配置和无关的系统/其他测试配置。从你打印的输出能看出来,getEnabledJobs方法把临时目录里所有符合规则的配置文件都读进来了,包括其他测试生成的残留文件。

核心原因

测试代码里的createPropertiesFile默认使用了系统共享的临时目录,而getEnabledJobs方法没有限定读取范围——它会遍历目录下所有符合条件的配置文件,导致把其他测试生成的临时文件、甚至项目里的其他配置都扫进来了。

解决方案

1. 给测试创建专属临时目录

修改测试代码,让生成的测试配置文件放在独立的专属临时目录里,这样getEnabledJobs只会读取这个目录下的文件,不会和其他测试的文件混在一起。修改后的代码如下:

import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Map;
import java.util.Properties;
import org.testng.Assert;

public void testGetEnabledJobs() throws IOException, ConfigurationException {
    // 创建专属的测试临时目录,避免和其他测试共享目录
    Path testTempDir = Files.createTempDirectory("wherehows-job-test-");

    String propertyStr1 = "job.class=test\n" + "job.cron.expr=0 0 1 * * ? *\n" + "#job.disabled=1\n" + "job.type=TEST1";
    String propertyStr2 = "job.class=test\n" + "#job.disabled=1\n";

    // 在专属目录下生成测试文件
    Path path1 = Files.createFile(testTempDir.resolve("test-job-1.properties"));
    Files.write(path1, propertyStr1.getBytes(StandardCharsets.UTF_8));
    Path path2 = Files.createFile(testTempDir.resolve("test-job-2.properties"));
    Files.write(path2, propertyStr2.getBytes(StandardCharsets.UTF_8));

    String filename1 = path1.getFileName().toString();
    String filename2 = path2.getFileName().toString();

    Map<String, Properties> jobs = getEnabledJobs(testTempDir.toString());
    System.out.println("Displaying jobs map");
    jobs.forEach((key, value) -> System.out.println(key + ":" + value));

    // 执行断言
    Assert.assertEquals(jobs.size(), 2);
    Assert.assertEquals(jobs.get(filename1).getProperty("job.class"), "test");
    Assert.assertEquals(jobs.get(filename1).getProperty("job.disabled", ""), "");
    Assert.assertEquals(jobs.get(filename2).getProperty("job.class"), "test");

    // 清理测试资源
    Files.deleteIfExists(path1);
    Files.deleteIfExists(path2);
    Files.deleteIfExists(testTempDir);
}

2. 检查并修正getEnabledJobs方法的读取逻辑

如果修改测试后还是有问题,那就要去看getEnabledJobs的实现:

  • 确认它是否递归读取子目录:如果是,改成只读取当前目录的文件;
  • 确认它是否有文件过滤规则:比如是不是只读取以.properties结尾的文件?有没有排除临时文件的前缀(比如temp开头的文件)?
  • 如果方法本身是用来读取所有job配置的,那测试时应该明确指定只读取测试生成的文件,而不是整个目录。

3. 临时跳过测试(应急方案)

如果赶时间编译,可以先跳过这个测试任务,继续后续步骤:

./gradlew build -x wherehows-common:test

注意:这只是临时方案,后续还是要修复测试保证代码质量。

验证

修改完成后,重新运行测试:

./gradlew wherehows-common:test --tests wherehows.common.utils.JobsUtilTest.testGetEnabledJobs

如果输出里只显示2个job,断言通过,就说明问题解决了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:30:56