Testing 测试驱动开发:Void方法

Testing 测试驱动开发:Void方法,testing,junit,tdd,Testing,Junit,Tdd,我一直在学习TDD(使用JUnit),我对如何测试void方法有疑问,在这种情况下,我不能直接在方法的返回值上使用assertTrue()之类的东西。。例如,假设我有一个简单的基于控制台的应用程序,其中一部分在屏幕上打印菜单,比如使用以下方法: public void printMenu() { System.out.println("Menu:"); System.out.println("1. Option ONE"); System.out.println("2. Opt

我一直在学习TDD(使用JUnit),我对如何测试void方法有疑问,在这种情况下,我不能直接在方法的返回值上使用assertTrue()之类的东西。。例如,假设我有一个简单的基于控制台的应用程序,其中一部分在屏幕上打印菜单,比如使用以下方法:

public void printMenu()
{
   System.out.println("Menu:");
   System.out.println("1. Option ONE");
   System.out.println("2. Option TWO");
   System.out.println("3. Exit");
}

我的问题是,我真的必须测试这个方法吗??如果是这样,我该怎么做

捕获控制台输出并与预期进行比较

很难对依赖于静态方法调用的方法进行单元测试。这不是返回某物或作废的问题。您可以做的是将打印抽象到接口中,并使您的类依赖于此接口(例如使用构造函数注入):


在单元测试中,您可以模拟接口并验证是否对其调用了正确的方法。这样,您就可以独立地测试printMenu。

您不能对该方法进行单元测试

此方法不需要单元测试所需的逻辑或处理

如果需要对打印菜单进行单元测试,可以考虑将结果输出到文本文件。


然后读取文本文件并比较菜单文本。

首先:测试UI很难。有些人不想费心测试这样的东西,因为很难编写没有脆弱到无用点的有意义的测试。我不会费心去测试这个方法

但是:

如果您想测试菜单生成,因为您的菜单代码很复杂,并且您需要确保它工作的方法,那么您有两个选择

  • 重构方法,使其接受输出流作为参数,然后传入一个可以检查其内容的输出流。您还可以重定向System.out以实现此目的
  • 重构方法,使菜单生成为一组对象,然后单独打印。您可以检查和验证这些对象
  • private SomePrinterInterface _printer;
    
    public void printMenu()
    {
       _printer.println("Menu:");
       _printer.println("1. Option ONE");
       _printer.println("2. Option TWO");
       _printer.println("3. Exit");
    }