0

所以,我正在做一个项目,我必须测试我的方法是否ParseException在它发生时捕捉到它。这是我需要测试的方法的样子:

public void convertToModel(final BuildStone bs, final TextBuildStone model) {
    try {
        model.setBeginDateRange(ProjectDateConverter.projectDateToCalendarDefaultMin(bs.getFromDate(), true));
    } catch (final ParseException e) {
        SystemContext.getLogger().warning(
                this,
                "treatGeneralData",
                "Date not converted: {0}, BeginDate set at MinDate",
                bs.getFromDate());
        model.setBeginDateRange(CalendarConstants.getMinDate());
    }

所以我必须测试这个方法何时捕获一个ParseException.

抛出 ParseException 的方法是projectDateToCalendarDefaultMin,这里是该方法的代码:

public static Calendar projectDateToCalendarDefaultMin(final BigDecimal dateValue, final boolean useMinDate) throws ParseException {
    return dateValue == null ? ProjectDateConverter.projectDateStringToCalendar(null, useMinDate, false) : ProjectDateConverter
            .projectDateStringToCalendar(dateValue.toString(), useMinDate, false);

引发 ParseException 的方法被调用projectDateStringToCalendar。这是那个样子:

private static Calendar projectDateStringToCalendar(final String dateValue, final boolean useMinDate, final boolean useMaxDate)
        throws ParseException {
    if (useMinDate && useMaxDate) {
        throw new IllegalArgumentException("useMinDate and useMaxDate may not be set as true ");
    }
    if (StringUtils.isEmpty(dateValue)) {
        if (useMinDate) {
            return CalendarConstants.getMinDate();
        } else if (useMaxDate) {
            return CalendarConstants.getMaxDate();
        } else {
            return null;
        }
    }
...
final GregorianCalendar gc = new GregorianCalendar();
    gc.setTime(new SimpleDateFormat("yyyyMMdd").parse(dateValue));

    return gc;
}

所以这是ParseException最终在方法中抛出的地方parse()ParseException来自text.parse包,方法解析如下所示:

 public Date parse(String source) throws ParseException
{
    ParsePosition pos = new ParsePosition(0);
    Date result = parse(source, pos);
    if (pos.index == 0)
        throw new ParseException("Unparseable date: \"" + source + "\"" ,
            pos.errorIndex);
    return result;
}

我已经尝试做的是设置bs.getFromDate为 null 但测试总是红色的。我在测试中使用@Test(expected: ParseException.class)了注释,但我无法让它变绿。也许bs.getFromDate不是正在解析的正确值?

有没有人有任何其他想法如何使这个测试工作?提前致谢!

4

4 回答 4

3

好的,所以最简单的方法是:

  • 使用将引发ParseException的参数调用您的方法
  • 如果没有向测试抛出异常,则意味着它被方法捕获

查看您的代码还有另一种方法可以执行:
如果已捕获异常,我看到您在模型上设置了开始日期范围: model.setBeginDateRange(CalendarConstants.getMinDate());

因此,在您的测试中,您可以检查:
model.getBeginDateRange()是否等于CalendarConstants.getMinDate()
(您可能需要在检查之前获取模型的实际版本,具体取决于您的代码的工作方式)

希望有帮助。

于 2013-06-16T12:44:26.237 回答
1

JUnit@Test(expected)注释要求您准确了解将引发哪个异常。

如果您假设ParseException, 但NullPointerException被抛出,则测试将显示为失败。

试试看@Test(expected = Exception.class)是否能处理所有这些问题。

于 2013-06-16T11:02:32.640 回答
1

使用模拟框架(例如 Mockito、EasyMock)模拟对 projectDateToCalendarDefaultMin 方法的调用并抛出 ParseException。

您的后置条件断言是模型的 beginDateRange 属性已设置为 CalendarConstants.getMinDate()。

于 2013-06-16T11:03:26.877 回答
0

我认为引发了另一个异常,而您没有捕捉到它。即,当您调用此方法时:

projectDateToCalendarDefaultMin(final BigDecimal dateValue, final boolean useMinDate) throws ParseException {

为您提供null价值,这就是您的测试为红色的原因。dateValueNullPointerExcpetion

于 2013-06-16T11:09:03.843 回答