JUnit测试没有达到预期的效果

时间:2012-10-26 05:44:38

标签: java testing junit

我对JUnit测试有疑问。

我正在尝试测试我的代码,但由于某种未知的原因,它一直让我失败。这是我尝试测试的代码:

public void userInputWord() throws Exception{ 
    System.out.println("****Please input your word, 2 to 8 ***");
    System.out.println("**********character strings.**********");
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    inputWord = br.readLine();
    setInputWord(inputWord);
    setWordLenght(inputWord.length());          
    System.out.println("***Please input amount of words you***");
    System.out.println("*************want to find*************");
    try{
        stringLadder = br.readLine();
        setLadder(Integer.parseInt(stringLadder));
    }catch(NumberFormatException nfe){
        System.out.println("Your input must be integer value.");
    }
    searchForMatch();
}

基本上这个方法要求用户输入两个值(起始单词和他想要看多少单词作为WordLadder)我将这些值分配给set方法。我这节课的JUnit如下:

public void testUserInputWord() {
    Generation gener = new Generation();
    StringReader read = new StringReader("broom");
    Scanner scan = new Scanner(read);
    gener.setInputWord(scan.toString());
    assertEquals("broom", gener.getInputWord());
}

我之前从未写过JUnit,只做了一些研究,有人能解释我做错了什么吗?

2 个答案:

答案 0 :(得分:2)

嗯,第一个问题是你永远不会调用你想要测试的代码。目前您正在测试的是getter和setter(ladderinputWord)。

不幸的是,测试userInputWord方法很棘手,因为它依赖于System.in。你需要有一种“伪造”用户输入的方法。一种选择是使方法采用ScannerReader。然后,您可以通过StringReader创建所有适当的用户输入,以便该方法读取您预编程的数据。然后,您将测试结果。如果此类的其他部分也需要用户输入,您可能需要更改它,以便构造函数获取某些内容(同样,可能是Scanner,可能是Reader)代表用户输入。同样,在构建测试实例时,您将提供测试数据。

从根本上说,“提供用户输入的东西”的想法是您尝试测试的代码的依赖 - 单元测试的许多技巧正在研究如何提供依赖于您的测试控制。有很多方法适用于不同的情况 - 在这种情况下,您可以使用现有的实现(StringReader)作为底层数据源而不是控制台。

答案 1 :(得分:2)

你说JUnit测试不符合你的预期。也许您应该告诉我们您的预期究竟是什么,所以我们可以告诉您为什么不满足期望。

正如乔恩所说,代码片段你告诉我们并不真正属于一个整体。您的测试方法似乎测试了setInputWord / getInputWord对setter和getter。根本没有致电userInputWord

此外,我可以看到您的测试方法以test为前缀,并且没有任何注释。这是一种非常过时的JUnit 3风格。请查看JUnit Cookbook

相关问题