如何在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