mockServer andExpect(content().XML 与当前日期连接

mockServer andExpect(content().XML with current date concatenated

我收到一个断言错误“Body Content Expected child but was null when asserting the andExpect XML。如果我作为字符串“2020-10-01-5:00”输入,它工作正常但是如果我将日期连接成一个字符串,例如:

    LocalDate startDate = LocalDate.now().minusDays(90);
    String startDateLine =  "<start-date>" + startDate + "-5:00</start-date>\n";

它抛出 AssertionError。我已经在调用之前验证了 XML 是正确的,所以我不确定获取日期并转换为字符串会导致测试失败。

更新

不要将偏移字符串添加到 LocalDate 字符串以将其转换为 OffsetDateTime 字符串。下面显示的是将 LocalDate 转换为 OffsetDateTime

的惯用方法
LocalDate.of(2020, 10, 1)
         .atStartOfDay()
         .atOffset(ZoneOffset.of("-05:00"));

演示:

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;

public class Main {
    public static void main(String[] args) {
        LocalDate date = LocalDate.of(2020, 10, 1);
        LocalDateTime ldt = date.atStartOfDay();
        OffsetDateTime odt = ldt.atOffset(ZoneOffset.of("-05:00"));
        System.out.println(odt);
    }
}

输出:

2020-10-01T00:00-05:00

ONLINE DEMO

您可以使用函数 OffsetDateTime#toString 获得 OffsetDateTimeString 表示,例如

String strOdt = odt.toString();

原回答

  1. 将您的输入更改为 HH:mm 格式的时区偏移量,例如-05:00 使其符合 ISO 8601 standards.
  2. 使用 DateTimeFormatterBuilder.parseDefaulting(ChronoField.HOUR_OF_DAY, 0) 将一天中的小时数默认为 0。
  3. 将给定的字符串解析为 OffsetDateTime,因为它具有时区偏移,而 OffsetDateTime 最适合表示具有时区偏移的日期时间。

演示:

import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtf =new DateTimeFormatterBuilder()
                                .appendPattern("u-M-d[H:m:s]XXX")
                                .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
                                .toFormatter(Locale.ENGLISH);
        
        OffsetDateTime odt = OffsetDateTime.parse("2020-10-01-05:00", dtf);
        System.out.println(odt);
    }
}

输出:

2020-10-01T00:00-05:00

ONLINE DEMO

注意方括号内的可选模式。

了解有关 modern Date-Time API* from Trail: Date Time 的更多信息。