datetimeformatter.ofpattern(…)在jenkins上返回null,而在本地它可以工作

qkf9rpyu  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(314)

这个问题在这里已经有了答案

在windows中,ZoneDateTime.parse()对于完全相同的字符串失败,但在mac和linux中工作(1个答案)
19天前关门了。
当我们使用jacococoveragedge工具在jenkins上运行测试时,在ide上本地工作的两个测试在jenkins上失败了。
Jenkins·斯塔克特

java.lang.NullPointerException: formatter
    at java.util.Objects.requireNonNull(Objects.java:228)
    at java.time.LocalDateTime.format(LocalDateTime.java:1751)
    at valid.package.MyUtils.generateReferenceId(MyUtils.java:356)

测试等级

public class MyUtils{

       private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("ddMMyyyyHHmmss");

//method under test
public static String generateReferenceId(StationState stationState) {
        StringBuilder referenceId = new StringBuilder();
        referenceId.append(String.format("%04d", stationState.getLocationId()));
        referenceId.append(String.format("%06d", stationState.getStoreNbr()));
        referenceId.append(String.format("%02d", stationState.getSessionId()));
        referenceId.append(LocalDateTime.now().format(formatter));  //null was found here - line 356
        return referenceId.toString();
    }

测试

@RunWith(PowerMockRunner.class)
@PrepareForTest({
        MyUtils.class
})
class MyUtilsTest{
@Test
        public void generateReferenceId_whenGenerate_shouldReturnNotNull() {
            //given
            //when
            String referenceId = MyUtils.generateReferenceId(stationState);
            //then
            // assertions
        }

第二个测试的方法在不同的类中,在不同的模式旁边看起来是相同的。

private static final String TIMESTAMP_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS";
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(TIMESTAMP_FORMAT);

所以没有理由放在这里。所以:
我想知道datetimeformatter.ofpattern(..)如何为私有静态final返回null?
你认为这是因为powermockito在与jacoco一起使用时会引起问题吗。我们正在发布一个较低的覆盖面,如上述链接所述。
当我内联
private static final datetimeformatter formatter=datetimeformatter.ofpattern(时间戳格式);
到generatereferenceid()方法

referenceId.append(LocalDateTime.now().format(DateTimeFormatter.ofPattern("ddMMyyyyHHmmss")));

对Jenkins的测试不再抛出npe了。
环境详情:
local env:java版本1.8.0.271,win 10操作系统,country pl
Jenkins版本:

[java]      [echo] *       Run By: jenkins on Wednesday, December 9, 2020 11:07:40 AM UTC
[java]      [echo] *          JVM: Oracle Corporation v25.231-b11
[java]      [echo] *           OS: Linux amd64 v4.14.203-156.332.amzn2.x86_64

Jenkins在英国的aws上。

piwo6bdm

piwo6bdm1#

变通办法
我在一个测试过的方法中内联了常量datetimeformatter.ofpattern(format),它不再对jenkins抛出nullpointerexception。

public static String generateReferenceId(StationState stationState) {
        StringBuilder referenceId = new StringBuilder();
        referenceId.append(String.format("%04d", stationState.getLocationId()));
        referenceId.append(String.format("%06d", stationState.getStoreNbr()));
        referenceId.append(String.format("%02d", stationState.getSessionId()));
        referenceId.append(LocalDateTime.now().format(DateTimeFormatter.ofPattern(FORMAT)));
        return referenceId.toString();
    }

也许这不是一个解决办法,因为我没有找到根本原因,但可以肯定的是,这是一个简单的解决办法。
为了确保我已经做了一个测试,并且首先在第一个失败的测试方法中做了一个内联测试,然后它通过了,而另一个常量失败了。在我把它内联到第二个测试方法是通过了。

相关问题