2012-02-23 206 views
0

嗨我是新编写JUnit测试用例。任何人都可以用这种方法帮助我吗?Junit测试用例

private boolean validateDate(Date date, String datesInCsv) { 
     boolean dateAlreadyExist= false; 
     final String[] dateVal = datesInCsv.split(","); 
     List<Date> allDates = new ArrayList<Date>(); 


     for (final String stringDate : dateVal) { 
      allDates .add(DateUtil.parseDate(stringDate ,"MM/dd/yyyy")); 
     } 
     if (allDates .contains(date)) { 
      dateAlreadyExist= true; 
     } 
     return dateAlreadyExist; 
    } 

如何在写这些类型的方法的测试用例之前开始以及应该记住什么?

回答

0

通常你不直接测试私有方法,但是你可以通过测试调用它的方法来获得测试覆盖率。没有什么说你不能测试它。

您将需要使用反射(或Groovy)来测试它,因为它是私有的。对于要测试的内容,您需要测试null和其他意外的输入值以及任何边界条件(真正的大日期,非常小的等等)。另外在你的情况下,你可能想检查意外的日期格式。

Junit网站(和junit谷歌或Stackoverflow搜索)可以为您提供更多关于单元测试的想法。

希望这会有所帮助。

1

测试纯粹主义者会回答“如何开始”,说的是开始测试,而不是实施。但是,当你有自己的方法时,你已经超过了这一点。

和cjstheno是正确的,测试私有方法是,这个,很奇怪。

所以我通常与测试开始围绕无效输入

@Test(expected = IllegalArgumentException.class) 
public void nullDateIsBadInput() { 
    yourclass.validateDate(null, "01/01/2000"); 
} 

然后我测试方法

@Test 
public void janFirstIsInInput() { 
    Assert.assertTrue("janFirst is in inuputs", 
     yourclass.validateDate(janFirst, "01/01/2000, 01/02/2000"); 
} 

@Test 
public void janFirstIsNotInInput() { 
    Assert.assertFalse("janFirst is not in inputs", 
     yourclass.validateDate(janFirst, "04/01/2000, 01/02/2000"); 
} 

不要忘了把可选的消息到assert调用的主旨,当你回到代码时,它会让你更容易。

最后,在测试工作完成后,不要忘记重构代码(以及测试!)返回值allDates .contains(date)而不是将其存储在冗余变量中。

+0

这是一个非常好的答案(尽管assertTrue和assertFalse拼写错误),并且我只是+1了。有一点我不同意 - “不要忘记将可选消息放入声明中”。对于这种风格的测试,每种测试方法都有一个断言,我认为这不合理;实际上它违反了DRY。 JUnit报告失败方法的名称 - 在这些示例中,方法的名称与断言中的消息完全相同。我宁愿不要使用可选消息;如果你的测试中有很多断言,现在是时候把它分解成更小的测试。 – 2012-02-26 08:31:47

0

从@Paul开始,不要忘记在迭代周围测试边界。由于datesInCsv可以是多个日期,因此请测试空字符串,表示单个日期的字符串以及表示多个日期的字符串。

然后,您可以对可疑输入进行预测,然后回到您的要求。这包括诸如开始,结束或字符串中的日期之间的空格。尾随逗号怎么样?这些类型的可疑事物作为测试非常重要,因为它们可以作为未来开发人员的需求文档的一种形式,这些开发人员可能会迟来,希望“优化”事情。请记住,测试的目标不仅仅是确保今天的事情正在发挥作用,而且还要以可执行形式保存这些期望,以确保明天它们也是真实的。