JUnit测试抛出异常的方法

时间:2018-02-14 09:47:27

标签: 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, 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));
    }
}

但总是失败。什么应该是测试这种情况的正确方法。

3 个答案:

答案 0 :(得分:2)

更改您的测试代码,因为如果抛出false,您将返回DateTimeParseException

@Test
public void should_throw_an_exception_if_failed_to_parse_dates() {
    assertThat(parseStartAndEndDates("sdf", "ssdf")).isFalse(); // parsing invalid data here

}

答案 1 :(得分:1)

你有两种方式: 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();
    }

...

@Test(expected = DateTimeParseException.class)
 public void should_throw_an_exception_if_failed_to_parse_dates(){
    parseStartAndEndDates("sdf", "ssdf"); // parsing invalid data here
}

2)在测试中检查为false,因为parseStartAndEndDates()返回false

@Test
public void should_throw_an_exception_if_failed_to_parse_dates() {
    assertFalse(parseStartAndEndDates("sdf", "ssdf")); // parsing invalid data here

}

答案 2 :(得分:1)

像其他答案一样,你的方法实际上并没有抛出。您正在测试的消息实际上已传递给记录器。如果这是您想要的API,并且您仍然希望测试是否发出了正确的消息,那么您必须在测试中模拟记录器