测试驱动开发:Void方法

时间:2010-08-04 13:27:59

标签: testing junit tdd

我一直在学习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");
}

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

4 个答案:

答案 0 :(得分:3)

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

private SomePrinterInterface _printer;

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

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

答案 1 :(得分:2)

首先:测试用户界面很难。有些人不打扰这样的事情,因为编写有意义的测试是非常困难的,这些测试对于无用而言并不脆弱。我不打算测试这种方法。

可是:

如果您想测试菜单生成,因为您的菜单代码很复杂,并且您需要确保其有效的方法,您有几个选择。

  1. 重构您的方法,使其接受输出流作为参数,然后传入可以检查其内容的输出流。您也可以重定向System.out来实现此目的。
  2. 重构您的方法,以便将菜单生成为一堆对象,然后单独打印。您可以检查并验证这些对象。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

您无法对此方法进行单元测试。

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

如果需要对“打印菜单”进行单元测试,可以考虑将结果输出到文本文件。 然后阅读文本文件并比较菜单文本..