Java Junit测试用例

Java Junit测试用例,java,junit,Java,Junit,您好,我是编写JUnit测试用例的新手。有人能帮我用这个方法吗 private boolean validateDate(Date date, String datesInCsv) { boolean dateAlreadyExist= false; final String[] dateVal = datesInCsv.split(","); List<Date> allDates = new ArrayList<Date>

您好,我是编写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;
    }
private boolean validateDate(日期、字符串日期、CSV){
布尔值dateAlreadyExist=false;
最后一个字符串[]dateVal=datesInCsv.split(“,”);
List allDates=new ArrayList();
for(最终字符串stringDate:dateVal){
allDates.add(DateUtil.parseDate(stringDate,MM/dd/yyyyy));
}
if(所有日期。包含(日期)){
dateAlreadyExist=true;
}
返回日期已存在;
}

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

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

您需要使用反射(或Groovy)来测试它,因为它是私有的

至于要测试什么,您需要测试null和其他意外的输入值以及任何边界条件(非常大的日期、非常小的日期等)。此外,在您的情况下,您可能需要检查意外的日期格式

Junit网站(以及Junit google或Stackoverflow搜索)可以为您提供更多关于单元测试的想法


希望这有点帮助。

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

cjsheno是正确的,测试私有方法是,嗯,奇怪的

所以我通常从测试坏的输入开始

@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)
的值,而不是将其存储在冗余变量中。

从@Paul开始,不要忘了测试迭代的边界。由于
datesInCsv
可以是多个日期,请测试空字符串、表示单个日期的字符串和表示多个日期的字符串

然后是您对有问题的输入的期望,这又回到了您的需求。这包括字符串开头、结尾或日期之间的空格。尾随逗号呢?这些有问题的东西作为测试是非常重要的,因为它们作为未来开发人员的需求文档的一种形式,这些开发人员可能会在以后进入并想要“优化”东西。请记住,测试的目标不仅是确保今天的工作正常,而且还要以可执行的形式保存这些期望,以确保明天的结果也是正确的。

这是一个非常好的答案(尽管assertTrue和assertFalse拼写错误),我刚刚给出了+1。有一点我不同意——那就是“别忘了将可选消息放入断言”。对于这种类型的测试,每个测试方法一个断言,我认为这没有意义;事实上,它违反了干法。JUnit报告失败方法的名称——在这些示例中,方法的名称与断言中的消息完全相同。我不喜欢使用可选消息;如果您的测试中有许多断言,那么是时候将其分解为更小的测试了。