使用 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");
    }       
}

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

public void listarD() {
    int contD = calculateContD();
    if (contD == 0) {
        ...
    }    
}

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

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

一些建议:

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

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

因此,从理论上讲,您可以将"特殊"输出流放入System.out;运行void方法;然后检查您期望的消息...出现在你的那条溪流中。

但这根本没有多大意义:你看,在现实世界中,你很少打印到system.out。在现实世界中,您的方法

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

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

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

一般来说,只能通过人眼验证的功能不是一个好的设计。调用方永远不会知道调用函数后发生了什么。返回值或表示结果的异常总比没有好。

最新更新