2017-03-23 75 views
3

我有下面的代码,我不知道如何测试它。用JUnit测试一个无效方法

我试图访问计数contD ++,如果我有3个否定。

我不能与测试的东西像这样assertEquals(contD,3)

public void listarD() { 
    int contD = 0; 

    for(int i=0; i< clientes.length; i++) { 
     if(clientes[i].getSaldo() < 0) { 
      System.out.println(
        "Cliente: " + clientes[i].getNombre() + 
        ". Saldo: " + clientes[i].getSaldo()); 
      contD++; 
     } 
    } 

    if (contD == 0) { 
     System.out.println("No hay descubiertos :D"); 
    } 
    else { 
     System.out.println("TOTAL DESCUBIERTOS: " + contadorDescubiertos + " clientes"); 
    }  
} 
+1

你不能以这种方式测试一个void。你必须重构你的代码 – Jens

+0

如果你无法正确测试你的代码,那么这是一个糟糕的设计。 – Bevor

+0

@Bevor不好的设计背后的概念比简单的测试便宜得多 – karlihnos

回答

0

一般情况下,只能通过人眼进行验证的功能是不是一个很好的设计。呼叫者在他们呼叫你的功能后永远不会知道发生了什么。返回值或表示结果的异常比没有更好。

3

正确的方法是提取一个方法来计算您的contD值并对其进行测试。

public void listarD() { 

    int contD = calculateContD(); 

    if (contD == 0) { 
     ... 
    }  
} 

然后你可以测试这个calculateContD()方法。

3

一个设计良好的方法应该很容易测试,事实上你不能测试你的方法是一个设计缺陷的证据。

几点建议:

  • 使该方法可核实的结果(这可能意味着它是 不再无效)。
  • 将输出保留在永久存储中,如磁盘 或数据库。
2

有一个办法可以理论上测试这样的:一个可以变化背后的System.out对象。

因此,理论上,你可以把一个“特殊的”OutputStream放到System.out中;运行你的无效方法;然后检查你所期望的信息......显示在你的信息流中。

但是,这样做根本没有(多少)意义:你看,在现实世界中,你很少打印到system.out。在现实世界中,你的方法或者

  • 做返回值
  • 其他对象
  • 改变封闭的对象内部的一些状态,来电/类

这样:在在现实世界中,你编写关心这类事件的测试。

所以,正如你想象的那样;真正的答案是改变你的void方法的行为;通过返回已经计算的值!