【问题标题】:Trying to use Junit to verify console output matches a string尝试使用 Junit 验证控制台输出与字符串匹配
【发布时间】:2019-07-17 04:29:14
【问题描述】:

我正在尝试使用 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 class AnimalsTest extends junit.framework.TestCase{
public void testSpeciesInfo() {   
    assertEquals(" Penguin Trivia fact/n", penguin.speciesInformation());
}
}

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

【问题讨论】:

    标签: java junit


    【解决方案1】:

    一般来说,断言某些东西并不总是那么容易,尤其是当它们是静态方法时。

    在这种情况下,您可以为System.out 设置另一个Stream,这在另一个答案中进行了解释。

    但是,如果我们笼统地谈论测试,您应该问自己:“我真正需要测试什么?”实际上,您可能想测试是否打印了正确的字符串,对吧?所以:

    1. 至少打印了一些东西吗?
    2. 打印的字符串是预期的字符串吗?

    您可以使用您已经提到的工具检查第二个 - 断言方法的正确性,返回一个字符串。为此,您可以稍微重构您的方法:

    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");
         } 
    }
    

    这样您就可以轻松测试getSpeciesInforationText 的正确性。

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

    【讨论】:

      【解决方案2】:

      您可以为此使用ByteArrayOutputStream,将byteArrayOutputStream 中的new PrintStream 设置为System.setOut,然后您可以轻松断言控制台中登录的内容。

      See this for example

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-16
        • 1970-01-01
        • 2011-05-16
        • 1970-01-01
        • 2015-10-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多