Java JUnit-NoSuchElementException:未找到行

Java JUnit-NoSuchElementException:未找到行,java,maven,junit,java.util.scanner,Java,Maven,Junit,Java.util.scanner,我试图学习单元测试和Maven,为此我使用JUnit并编写简单的随机名称生成器。我有以下课程: public class Database { public String readRandomName(String url) throws FileNotFoundException { int sum = calculateFileLines(url); int lines = (int) (Math.random()*sum); File file = ne

我试图学习单元测试和Maven,为此我使用JUnit并编写简单的随机名称生成器。我有以下课程:

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;
  }
}
它工作得很好,但是当我试图用断言编写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
如果有任何帮助,我将不胜感激,谢谢

您正在调用nextLine,它在没有行时抛出异常,正如javadoc所描述的那样。它永远不会返回null

使用扫描仪,您需要检查hasNextLine是否有下一行

因此,循环变为

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

如果您能显示抛出NosTouchElementException的确切行,这会有所帮助。此外,您的main工作得很好,但它没有任何断言或SysOutHelpCome到堆栈溢出!请拿着这本书,四处看看,仔细阅读,尤其是和UnitTest不应使用JVM内存之外的任何资源。因此,不应在代码中创建Scanner对象,而应将其作为参数传递到代码中,而不是包含文件路径的字符串。
while(scanner.hasNextLine()){
    String str=scanner.nextline();
    //...
}