我一直在学习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");
}
我的问题是,我真的要测试这种方法吗?如果是这样,我该怎么做?
答案 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)
首先:测试用户界面很难。有些人不打扰这样的事情,因为编写有意义的测试是非常困难的,这些测试对于无用而言并不脆弱。我不打算测试这种方法。
可是:
如果您想测试菜单生成,因为您的菜单代码很复杂,并且您需要确保其有效的方法,您有几个选择。
答案 2 :(得分:1)
捕获控制台输出并与期望值进行比较
答案 3 :(得分:1)
您无法对此方法进行单元测试。
此方法不需要进行单元测试的逻辑或处理。
如果需要对“打印菜单”进行单元测试,可以考虑将结果输出到文本文件。 然后阅读文本文件并比较菜单文本..