使用JUnit测试void方法

时间:2017-03-23 14:25:51

标签: java junit

我有以下代码,我不知道如何测试它。

我试图访问count 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");
    }       
}

4 个答案:

答案 0 :(得分:3)

正确的方法是提取一个计算contD值并测试它的方法。

public void listarD() {

    int contD = calculateContD();

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

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

答案 1 :(得分:3)

设计良好的方法应该易于测试,无法测试方法的事实是设计缺陷的证据。

一些建议:

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

答案 2 :(得分:2)

有一种方法可以理论上测试这个:一个可以更改 System.out后面的对象。

所以,理论上,你可以放一个特殊的&#34; OutputStream进入System.out;运行你的void方法;然后检查您期望的消息......显示在您的流中。

但这根本没有意义:你知道,在现实世界中,你很少打印到system.out。在现实世界中,你的方法要么

  • 确实返回一个值
  • 其他对象进行调用
  • 更改封闭对象/类的一些内部状态

因此:在现实世界中,您编写关注此类事件的测试。

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

答案 3 :(得分:0)

一般来说,只能用人眼验证的功能并不是一个好的设计。呼叫者永远不会知道他们打电话给你的功能后发生了什么。返回值或表示结果的异常都比没有好。