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

测试用例本地与Jenkins运行异常,Instant.now()返回1970-01-01求助

问题原因分析与解决方案

核心问题

测试用例传入当前时间戳,但被测代码中DateTime.now()(或Instant.now())返回1970-01-01(Unix纪元起始时间),导致start对应的当日起始时间被判定为晚于当前时间,触发BadRequestException。

可能的原因及解决方法

1. 测试代码中时间类被Mock框架错误篡改

如果测试类使用了Mockito、PowerMock等Mock工具,大概率是不小心Mock了Instant.now()或DateTime.now()的默认实现,但未正确设置返回值,导致返回纪元起始时间。

  • 排查点:检查测试类是否存在类似错误代码:
    // 错误示例:仅Mock方法但未指定返回值
    mockStatic(Instant.class);
    // 或未设置thenReturn,默认返回null/默认值
    
  • 解决方式:要么移除不必要的静态Mock,要么明确指定Mock方法返回真实当前时间:
    when(Instant.now()).thenReturn(Instant.now());
    // 针对Joda-Time DateTime的情况
    when(DateTime.now()).thenReturn(DateTime.now());
    

2. 测试环境系统时间异常

虽然你提到本地和Jenkins时区均为UTC,但不排除测试进程读取系统时间时出现异常(比如容器化环境时间未同步、Jenkins节点时间配置错误)。

  • 验证方法:在测试代码中临时添加日志输出当前时间:
    @Test
    public void testingError(){
        System.out.println("Instant.now() = " + Instant.now());
        System.out.println("DateTime.now() = " + DateTime.now());
        List<Error> validationError = subscriptionValidator.testError(String.valueOf(Instant.now().getEpochSecond()));
        Assert.assertEquals(Boolean.TRUE,validationError.isEmpty());
    }
    
    运行测试后查看输出,确认是否真的返回1970年时间。
  • 解决方式:同步系统时间,Jenkins节点需确保与NTP服务器同步;容器环境需挂载宿主机时间或配置时间同步服务。

3. Joda-Time与Java 8时间API混用导致的隐性问题

被测代码同时使用Joda-Time的DateTime和Java 8的Instant,可能存在时区转换或初始化异常:

  • 问题点:new DateTime(start.toEpochMilli(), DateTimeZone.getDefault())在特殊环境下可能因时区初始化失败导致时间计算错误;或者DateTime.now()未指定时区,默认时区读取异常返回纪元时间。
  • 解决方式:统一时间API,推荐改用Java 8+的java.time包实现日期判断逻辑:
    public List<Error> testError(String epoch){
        List<Error> listError = new ArrayList<>();
        final Instant start = Instant.ofEpochSecond(Long.valueOf(epoch));
        // 统一使用UTC时区处理日期判断
        LocalDate startDate = start.atZone(ZoneOffset.UTC).toLocalDate();
        LocalDate currentDate = LocalDate.now(ZoneOffset.UTC);
    
        if(startDate.isAfter(currentDate)){
            final BadRequestException badRequestException =
                    new BadRequestException(messageByLocale.getMessage("error-message.invalid-start-date"));
            throw badRequestException;
        }
        return listError;
    }
    

4. Maven Surefire插件配置异常

使用mvn test package时,Surefire插件的特殊配置可能导致类加载异常,影响时间类的初始化。

  • 排查点:检查pom.xml中maven-surefire-plugin是否有禁用系统类加载、修改JVM参数等特殊配置。
  • 解决方式:简化Surefire配置,确保JVM能正常读取系统时间相关属性:
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.2.5</version>
        <configuration>
            <useSystemClassLoader>true</useSystemClassLoader>
        </configuration>
    </plugin>
    

总结

优先排查时间类的Mock错误(这是测试中出现纪元时间最常见的原因),其次验证系统时间是否正常,最后检查时间API混用和Maven插件配置问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 14:10:29