我对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,只做了一些研究,有人能解释我做错了什么吗?
答案 0 :(得分:2)
嗯,第一个问题是你永远不会调用你想要测试的代码。目前您正在测试的是getter和setter(ladder
和inputWord
)。
不幸的是,测试userInputWord
方法很棘手,因为它依赖于System.in
。你需要有一种“伪造”用户输入的方法。一种选择是使方法采用Scanner
或Reader
。然后,您可以通过StringReader
创建所有适当的用户输入,以便该方法读取您预编程的数据。然后,您将测试结果。如果此类的其他部分也需要用户输入,您可能需要更改它,以便构造函数获取某些内容(同样,可能是Scanner
,可能是Reader
)代表用户输入。同样,在构建测试实例时,您将提供测试数据。
从根本上说,“提供用户输入的东西”的想法是您尝试测试的代码的依赖 - 单元测试的许多技巧正在研究如何提供依赖于您的测试控制。有很多方法适用于不同的情况 - 在这种情况下,您可以使用现有的实现(StringReader
)作为底层数据源而不是控制台。
答案 1 :(得分:2)
你说JUnit测试不符合你的预期。也许您应该告诉我们您的预期究竟是什么,所以我们可以告诉您为什么不满足期望。
正如乔恩所说,代码片段你告诉我们并不真正属于一个整体。您的测试方法似乎测试了setInputWord
/ getInputWord
对setter和getter。根本没有致电userInputWord
。
此外,我可以看到您的测试方法以test
为前缀,并且没有任何注释。这是一种非常过时的JUnit 3风格。请查看JUnit Cookbook。