所以,我正在研究一个项目,我必须测试我的方法是否在它发生时捕获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
不是正确的值被解析?
有没有人知道如何让这项测试工作?提前谢谢!
答案 0 :(得分:1)
JUnit @Test(expected)
注释要求您准确了解将抛出的异常。
如果您假设ParseException
,但抛出NullPointerException
,则测试将显示为失败。
尝试@Test(expected = Exception.class)
并查看是否可以处理所有这些内容。
答案 1 :(得分:1)
使用模拟框架(例如Mockito,EasyMock)来模拟对projectDateToCalendarDefaultMin方法的调用并抛出ParseException。
您的帖子条件断言是模型的beginDateRange属性已设置为CalendarConstants.getMinDate()。
答案 2 :(得分:1)
好的,所以最简单的方法是:
查看您的代码还有另一种方法: 如果已捕获异常,我看到您在模型上设置了开始日期范围: 的 model.setBeginDateRange(CalendarConstants.getMinDate()); 强>
因此,在您的测试中,您可以检查:
model.getBeginDateRange()等于 CalendarConstants.getMinDate()
(您可能需要在检查之前获取模型的实际版本,具体取决于代码的工作方式)
希望有所帮助。
答案 3 :(得分:0)
我认为会抛出另一个异常并且你没有抓住它。也就是说,当你调用这个方法时:
projectDateToCalendarDefaultMin(final BigDecimal dateValue, final boolean useMinDate) throws ParseException {
null
的{{1}}值为dateValue
,这就是您的测试为红色的原因。