gpt4 book ai didi

java - 如何对 spring datetimeformat 验证进行单元测试

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:22:35 27 4
gpt4 key购买 nike

我有一个包含两个日期字段的 DTO 类。两者都使用 @NotNull@DateTimeFormat 进行注释。

我正在做 TDD,我注意到我的 NotNull 错误消息已成功返回,但是当我在单元测试中传递一个日期时,它几乎可以接受任何内容,即使它与我的模式不匹配.

有趣的是,当我在 thymeleaf 表单中进行测试时,它可以正常工作,并返回我预期的错误消息以及格式错误的日期。

我假设这与在我仅对 DTO 进行单元测试时未应用 DateTimeFormat 的 spring 有关,但为什么我的 not null 会按预期工作?

我在下面提供了 DTO 的代码

import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
import java.util.Date;

public class HourTracker {
@NotNull(message = "start time cannot be null")
@DateTimeFormat(pattern = "hh:mma")
private Date startTime;
@NotNull(message = "end time cannot be null")
@DateTimeFormat(pattern = "hh:mma")
private Date endTime;

//getters and setters
}

单元测试:

public class HourTrackerTest {
private static final String HOURS_INPUT_FORMAT = "hh:mma";
private Validator validator;
private HoursTracker tested;

@Before
public void setUp() throws Exception {
tested = new HoursTracker();
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
validator = factory.getValidator();
}

@Test
public void testValidTimeInputs() throws Exception {
SimpleDateFormat timeFormatForDate = new SimpleDateFormat(HOURS_INPUT_FORMAT);
Date validTimeInput = timeFormatForDate.parse("12:30pm");
tested.setStartTime(validTimeInput);
tested.setEndTime(validTimeInput);
assertEquals("Start time was not correctly set", validTimeInput, tested.getStartTime());
assertEquals("End time was not correctly set", validTimeInput, tested.getStartTime());
}

@Test
public void testNullStartTimeInputErrorMessage() throws Exception {
tested.setStartTime(null);
Set<ConstraintViolation<HoursTrackingForm>> violations = validator.validate(tested);
assertFalse("No violation occurred, expected one", violations.isEmpty());
assertEquals("Incorrect error message",
"Please enter a valid time in AM or PM",
violations.iterator().next().getMessage()
);
}

@Test
public void testNullEndTimeInputErrorMessage() throws Exception {
tested.setEndTime(null);
Set<ConstraintViolation<HoursTrackingForm>> violations = validator.validate(tested);
assertFalse("No violation occurred, expected one", violations.isEmpty());
assertEquals("Incorrect error message",
"Please enter a valid time in AM or PM",
violations.iterator().next().getMessage()
);
}

}

最佳答案

简单的回答,你不能在 spring 容器之外测试 Spring 约束。我试图以测试 javax 验证的方式进行测试

关于java - 如何对 spring datetimeformat 验证进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51896545/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com