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,并且您仍然希望测试是否发出了正确的消息,那么您必须在测试中模拟记录器

测试中未捕获异常,因为它已在测试方法中捕获。测试中未捕获异常,因为它已在测试方法中捕获。