2017-08-12 76 views
0

我试图学习单元测试和Maven,为此我使用JUnit并编写简单的随机名称生成器。我有以下类:JUnit - NoSuchElementException:找不到行

public class Database { 

    public String readRandomName(String url) throws FileNotFoundException { 
    int sum = calculateFileLines(url); 
    int lines = (int) (Math.random()*sum); 
    File file = new File(url); 
    Scanner scanner = new Scanner(file); 
    for (int i=0; i<lines;i++){ 
     scanner.nextLine(); 
    } 
    return scanner.nextLine(); 
    } 

    public int calculateFileLines(String url) throws FileNotFoundException { 
    int sum = 0; 
    try (Scanner scanner = new Scanner(new File(url))){ 
     while(scanner.hasNextLine() && scanner.nextLine().length()!=0){ 
      ++sum; 
     } 
    } 
    return sum; 
    } 
} 

当我运行简单的测试是这样的:

public static void main(String[] args) throws FileNotFoundException { 
    Database database = new Database(); 
    database.readRandomName("names/maleNamesPL.txt"); 
} 

它完美,但是当我试着写与断言JUnit测试出现意外故障,我穿上”不明白。这是测试代码:

@Test 
public void readRandomNameTest() throws FileNotFoundException { 
    Database database = new Database(); 
    Assert.assertNotNull("Should be some name", database.readRandomName("names/maleNamesPL.txt")); 
} 

而且结果:

Tests in error: 
readRandomNameTest(DatabaseTest): No line found 

我希望得到任何帮助,谢谢!

+0

这将有助于如果你想展示抛出'NoSuchElementException'的确切行。 – Andrei

+0

也,你的主要作品完美,但它没有任何断言或系统 – ByeBye

+0

欢迎来到堆栈溢出!请参考[游览](http://stackoverflow.com/tour),环顾四周,并阅读[帮助中心](http://stackoverflow.com/help) ,特别是[如何做我问一个好问题?](http://stackoverflow.com/help/how-to-ask)和[我可以问什么主题?](http://stackoverflow.com/help/on-topic) 。 - * UnitTest *应该**从不**使用JVM内存以外的任何资源。因此,您不应在代码中创建'Scanner'对象,而是将其作为参数传入代码而不是包含文件路径的'String'。 –

回答

1

你打电话给nextLine(),当没有行时,它会抛出异常,正如javadoc所描述的那样。它永远不会返回null

http://download.oracle.com/javase/1,5.0/docs/api/java/util/Scanner.html

随着Scanner你需要检查是否存在与hasNextLine()

下一行,以便循环将成为

while(scanner.hasNextLine()){ 
    String str=scanner.nextline(); 
    //... 
}