Java 尝试使用Junit验证控制台输出是否与字符串匹配

Java 尝试使用Junit验证控制台输出是否与字符串匹配,java,junit,Java,Junit,我试图使用Junit来验证方法输出的内容是否与使用assertequals的字符串匹配,但我无法让它工作。因为它说(String,Void)的测试用例是未定义的,所以我的方法代码如下 public void speciesInformation() { switch (species){ case"Penguin":System.out.println("Penguin Trivia fact"); break; default: System.ou

我试图使用Junit来验证方法输出的内容是否与使用assertequals的字符串匹配,但我无法让它工作。因为它说(String,Void)的测试用例是未定义的,所以我的方法代码如下

public void speciesInformation() {
     switch (species){ 

     case"Penguin":System.out.println("Penguin Trivia fact");
     break;

     default: System.out.println("There is no current information for that species");
     break;
     }       
}
我尝试使用的junit代码是(省略了其他测试):


我所有的其他测试都是基于返回的,但是这个测试应该基于public void方法打印的内容,我不知道怎么做,也找不到关于如何做的信息。

你可以使用
ByteArrayOutputStream
来实现这一点,在
系统中设置
新打印流
,然后您可以轻松地断言控制台中记录的内容


一般来说,断言某些东西并不总是容易的,特别是当它们是静态方法时

在这种情况下,您可以为
系统设置另一个

然而,如果我们谈论一般的测试,您应该问自己:“我真正需要测试什么?”实际上,您可能想测试打印的字符串是否正确,对吗?因此:

  • 至少有印刷的东西吗
  • 打印的字符串是否为预期的字符串
  • 您可以使用前面提到的工具检查第二个方法—断言方法的正确性,返回字符串。为此,您可以稍微重构一下您的方法:

    public void speciesInformation() {
      System.out.println(getSpeciesInforationText(species));
    }
    
    public void getSpeciesInforationText(String species) {
         switch (species){ 
    
         case"Penguin":
             return "Penguin Trivia fact");
    
         default: 
             return "There is no current information for that species");
         } 
    }
    
    通过这种方式,您可以轻松测试
    getspeciesformationtext
    的正确性

    第一种方法变得非常简单-您只需在那里调用
    print
    方法。因此,您要么不能全部测试(因为它非常简单),要么可以使用一种称为Mocking的技术来测试您调用的方法。但这需要你方采取更多的行动。如果您对它感兴趣,请查看什么是
    Mockito
    ,以及如何使用它

    public void speciesInformation() {
      System.out.println(getSpeciesInforationText(species));
    }
    
    public void getSpeciesInforationText(String species) {
         switch (species){ 
    
         case"Penguin":
             return "Penguin Trivia fact");
    
         default: 
             return "There is no current information for that species");
         } 
    }