如何测试在jUnit中在控制台上打印的void方法?

时间:2015-05-20 14:54:31

标签: java junit

我使用工厂模式。我有3种货币:美元,RON和欧元。在每个类中,我都有相同的功能,print,具有不同的输出:

public void print() {
    System.out.println("I printed dollars!");

}

     public void print() {
    System.out.println("I printed euro!");}

在我的工厂类中,我有一个方法返回一个新的货币类型对象:

    public Valuta getValuta(String numeValuta){
    if(numeValuta == null){
        return null;
    }
    if(numeValuta.equalsIgnoreCase("dolar")){
        return new Dolar();
    }
    if(numeValuta.equalsIgnoreCase("euro")){
        return new Euro();
    }
    if(numeValuta.equalsIgnoreCase("lei")){
        return new Lei();
    }
    return null;
}

现在,在我的Test课程中,我尝试了测试:

    FabricaBani fabrica = new FabricaBani();
    Valuta valuta = fabrica.getValuta("dolar");
    valuta.tipareste();
    assertEquals("I printed dollars!", valuta.print());

我收到一条错误,指出我无法测试带有void的String。我尝试在valuta.print之后添加.toString,但我不被允许。

3 个答案:

答案 0 :(得分:2)

valuta方法不会返回任何内容,这就是为什么valuta.print()不能输出到控制台的字符串。

如果要测试该值,可以重构方法以返回String而不是输出它;然后,您将在调用print()的方法中打印返回的String。

public String print() {
    return "I printed dollars!";
}

 public void print() {
  return "I printed euro!";
 }

然后,您可以像这样调用打印输出到控制台

System.out.println(valuta.print());

您可以将print方法重命名为getCurrency,以更好地表达该方法的作用。

答案 1 :(得分:2)

您可以编写一个调用setOut来捕获打印输出的测试,如下所示:

private static void test() {
    System.out.println("Hello, world!");
}
public static void main (String[] args) throws java.lang.Exception
{
    String res = null;
    PrintStream originalOut = System.out;
    try {
        ByteArrayOutputStream os = new ByteArrayOutputStream(100);
        PrintStream capture = new PrintStream(os);
        // From this point on, everything printed to System.out will get captured
        System.setOut(capture);
        test();
        capture.flush();
        res = os.toString();
    } finally {
        System.setOut(originalOut);
    }
    System.out.println("Captured output: "+res);
}

Demo.

这远非理想,只有当您没有其他方法来测试相关功能时才应该使用它 - 例如,当您无法控制执行输出的部分代码时。

另一方面,这种方法可以让您测试必须进行某些打印的代码的副作用,因此在您的测试必须确保输出到System.out的情况下它可能是相关的。

答案 2 :(得分:0)

这种情况的一个很好的选择可能是扩展美元(或一个单独的继承类)进行测试。然后,在调用print()方法时,您可以存储打印的最后一个字符串。

// Inside class extending Dollar, for example
// public class TestDolar extends Dollar
@Override
public void print() {
  _printedMessage = Valuta.DOLLAR_MESSAGE
}

这可能意味着您可以将打印消息存储在Valuta 或各个类中。

//Inside Dollar
public void print() {
  System.out.println(Valuta.DOLLAR_MESSAGE);
}

//Inside Valuta
public static final String DOLLAR_MESSAGE = "I printed dollars!";