Java 引发异常的方法的JUnit测试
我有一个方法,当给定的日期和时间无效时抛出异常Java 引发异常的方法的JUnit测试,java,unit-testing,junit,Java,Unit Testing,Junit,我有一个方法,当给定的日期和时间无效时抛出异常 try { startDateTime = LocalDateTime.parse(startDate, DATE_TIME_FORMATTER); endDateTime = LocalDateTime.parse(endDate, DATE_TIME_FORMATTER); } catch (DateTimeParseException e) { LOGGER.error(ERROR_PARSING_DATE_TIME
try {
startDateTime = LocalDateTime.parse(startDate, DATE_TIME_FORMATTER);
endDateTime = LocalDateTime.parse(endDate, DATE_TIME_FORMATTER);
} catch (DateTimeParseException e) {
LOGGER.error(ERROR_PARSING_DATE_TIME, e);
return false;
}
在测试中,我试图用无效数据验证此异常
@Test
public void should_throw_an_exception_if_failed_to_parse_dates() {
try {
parseStartAndEndDates("sdf", "ssdf"); // parsing invalid data here
fail(); //remember this line, else 'may' false positive
} catch (DateTimeParseException e) {
assertThat(e.getMessage(), is(ERROR_PARSING_DATE_TIME));
}
}
但这总是失败的。测试这种情况的正确方法应该是什么 如下更改测试代码,因为如果抛出
DateTimeParseException
,则返回false
@Test
public void should_throw_an_exception_if_failed_to_parse_dates() {
assertThat(parseStartAndEndDates("sdf", "ssdf")).isFalse(); // parsing invalid data here
}
按如下所示更改测试代码,因为如果引发了
DateTimeParseException
,则返回false
@Test
public void should_throw_an_exception_if_failed_to_parse_dates() {
assertThat(parseStartAndEndDates("sdf", "ssdf")).isFalse(); // parsing invalid data here
}
你有两种方法:
1) 在第一个方法内引发异常:
try {
startDateTime = LocalDateTime.parse(startDate, DATE_TIME_FORMATTER);
endDateTime = LocalDateTime.parse(endDate, DATE_TIME_FORMATTER);
} catch (DateTimeParseException e) {
LOGGER.error(ERROR_PARSING_DATE_TIME, e);
throw new DateTimeParseException();
}
2) 在测试中选中false,因为parseStartAndEndDates()
返回false
:
@Test
public void should_throw_an_exception_if_failed_to_parse_dates() {
assertFalse(parseStartAndEndDates("sdf", "ssdf")); // parsing invalid data here
}
你有两种方法:
1) 在第一个方法内引发异常:
try {
startDateTime = LocalDateTime.parse(startDate, DATE_TIME_FORMATTER);
endDateTime = LocalDateTime.parse(endDate, DATE_TIME_FORMATTER);
} catch (DateTimeParseException e) {
LOGGER.error(ERROR_PARSING_DATE_TIME, e);
throw new DateTimeParseException();
}
2) 在测试中选中false,因为parseStartAndEndDates()
返回false
:
@Test
public void should_throw_an_exception_if_failed_to_parse_dates() {
assertFalse(parseStartAndEndDates("sdf", "ssdf")); // parsing invalid data here
}
正如其他答案所说,您的方法实际上不会抛出错误。您正在测试的消息实际上已传递给记录器。如果这是您想要的API,并且您仍然希望测试是否发出了正确的消息,那么您必须在测试中模拟记录器,就像其他答案所说的那样,您的方法实际上不会抛出错误。您正在测试的消息实际上已传递给记录器。如果这是您想要的API,并且您仍然希望测试是否发出了正确的消息,那么您必须在测试中模拟记录器测试中未捕获异常,因为它已在测试方法中捕获。测试中未捕获异常,因为它已在测试方法中捕获。