测试驱动开发:无返回值方法

4

我一直在学习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个回答

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。


2

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

但是:

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

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

1

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


1

你无法对这个方法进行单元测试。

这个方法没有任何逻辑或处理需要进行单元测试。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接