Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中创建日期对象?_Java_Spring Boot_Unit Testing_Spring Test - Fatal编程技术网

如何在java中创建日期对象?

如何在java中创建日期对象?,java,spring-boot,unit-testing,spring-test,Java,Spring Boot,Unit Testing,Spring Test,所以我在做一个单元测试,测试从数据库中获取的数据。问题是,我似乎无法在单元测试中正确格式化我想要的日期。 该错误将使我的问题更加清楚: java.lang.AssertionError: expected:<2021-04-05 00:00:00.0> but was:<Mon Apr 05 00:00:00 CEST 2021> at org.junit.Assert.fail(Assert.java:88) 如何正确设置日期格式,使其与预期结果相匹配? 谢谢

所以我在做一个单元测试,测试从数据库中获取的数据。问题是,我似乎无法在单元测试中正确格式化我想要的日期。 该错误将使我的问题更加清楚:

java.lang.AssertionError: expected:<2021-04-05 00:00:00.0> but was:<Mon Apr 05 00:00:00 CEST 2021>
    at org.junit.Assert.fail(Assert.java:88)
如何正确设置日期格式,使其与预期结果相匹配? 谢谢

根据要求,结果类

@Entity
@Table(name = "result")
@Getter
@Setter
public class Result {
    public Result(Integer id, Date date,  String name) {
        this.id = id;
        this.name = name;
        this.date = date;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;
    private Date date;

    @JsonIgnore
    @OneToMany(mappedBy = "result", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    private Set<PartyResultUser> partyResultUsers;

    public Result() {

    }
}
@实体
@表(name=“result”)
@吸气剂
@塞特
公开课成绩{
公共结果(整数id、日期、字符串名称){
this.id=id;
this.name=名称;
this.date=日期;
}
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私有整数id;
私有字符串名称;
私人日期;
@杰索尼奥雷
@OneToMany(mappedBy=“result”,cascade={CascadeType.PERSIST,CascadeType.MERGE})
私有设置partyResultUsers;
公开结果(){
}
}
旁白:
Date是一个糟糕的类,它被java.time.*包中的类所取代,这些包是从Java8开始的(或大约是从Java8开始的)

也就是说, 这里有一些代码可以从
OffsetDateTime

        Date actualDate;
        OffsetDateTime testOffsetDateTime;

        testOffsetDateTime = OffsetDateTime.now()
            .truncatedTo(ChronoUnit.DAYS)
            .withYear(2021)
            .withMonth(4)
            .withDayOfMonth(5);

        actualDate = new Date(testOffsetDateTime.toInstant().toEpochMilli());
在代码执行之后,
actualDate
变量将包含一个实际的
Date
值。 随你的便

注:
这不是实现你期望目标的“最佳”方式, 但这是实现目标的一种实用方法

最后,, 这不太可能解决你的问题。 在问题中包含
ResultDto
类之前,
我们不太可能确定真正的问题。

Assert.assertEquals
中,如果参数是Object,则使用
Object.toString()
进行比较。在您的例子中,
date
是一个
对象,因此
Assert.assertEquals
date.toString()
createdResult.getDate()进行比较。正如在
toString()
方法中写入的
Date
返回
String
,格式为
dow mon dd hh:mm:ss zzz yyyy
。在您的情况下,
var inputString=“2021-04-05 00:00:00.0”
将转换为
Mon Apr 05 00:00:00 CEST 2021
。不要使用
Assert.assertEquals(createdResult.getDate(),date)

Assert.assertEquals(createdResult.getDate(),inputFormat.format(date))

Assert.assertEquals(createdResult.getDate(),inputString)


在回复我帖子的人的帮助下,我找到了答案:

我的服务类别:

@Test
void whenSaveResult_thenCorrectResultSaved() throws ParseException {
    // given
    var inputString = "2021-04-05 00:00:00.0";
    DateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
    Date date = inputFormat.parse(inputString);

    var input = ResultDto.builder()
            .name("Fontys Result")
            .date(date)
            .build();

    // when
    resultService.saveResult(input);

    var createdResult = em.createQuery("SELECT l FROM Result l WHERE l.name = 'Fontys Result' ", Result.class).setMaxResults(1).getSingleResult();


    // then
    Assert.assertEquals(createdResult.getName(), "Fontys Result");
    Assert.assertEquals(createdResult.getDate(), date);
}
 @Test
    void whenSaveResult_thenCorrectResultSaved() throws ParseException {

        // given
        LocalDate localDate = LocalDate.of(2021, 04,05);

        var input = ResultDto.builder()
                .name("Fontys Result")
                .date(localDate)
                .build();

        // when
        resultService.saveResult(input);

        var createdResult = em.createQuery("SELECT l FROM Result l WHERE l.name = 'Fontys Result' ", Result.class).setMaxResults(1).getSingleResult();


        // then
        Assert.assertEquals(createdResult.getName(), "Fontys Result");
        Assert.assertEquals(createdResult.getDate(), localDate);
    }
我的成绩班

@Entity
@Table(name = "result")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Result {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;
    private LocalDate date;

    @JsonIgnore
    @OneToMany(mappedBy = "result", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    private Set<PartyResultUser> partyResultUsers;
    
}
@实体
@表(name=“result”)
@吸气剂
@塞特
@诺尔格构装师
@AllArgsConstructor
公开课成绩{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私有整数id;
私有字符串名称;
私有本地日期;
@杰索尼奥雷
@OneToMany(mappedBy=“result”,cascade={CascadeType.PERSIST,CascadeType.MERGE})
私有设置partyResultUsers;
}

您有一个正确的日期对象。您试图比较的是格式化的日期和格式化的字符串。您的期望值和实际值不匹配,因此请更改您的期望值,或者更改您测试的方法返回的格式如何更改inputFormat的值,使其看起来像这样:2021-04-05 00:00:00.0在测试中,您执行了格式设置,您在getDate()中执行了相同的格式设置吗“createdResult”的方法?尝试打印:System.out.println(createdResult.getDate());在你的断言之前。或者,您的日期变量的格式应该正确。不,它只是从数据库中获取日期,该数据库的格式如下2021-04-05 00:00:00.0您可以与我们共享结果类吗?但是createdResult.getDate()也是一个日期,应该转换为相同的字符串。或者createdResult是否返回一个sql.Date?也许它是格式化字符串,如果@LardinoisJose与我们共享结果类,我们可以找到最佳解决方案。正如您所写的,它可以是sql.Date