簡體   English   中英

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

[英]How to test a void method that prints on console in 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());

我收到一條錯誤消息,提示我無法測試帶有空值的字符串。 我嘗試將.toString放在valuta.print之后,但不允許這樣做。

valuta方法不返回任何內容,這就是為什么valuta.print()不能是您輸出到控制台的String的原因。

如果要測試該值,則可以重構方法以返回String而不是輸出它; 然后您將在調用print()的方法中打印返回的String。

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

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

然后,您將像這樣調用打印輸出到控制台

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

您可以將print方法重命名為getCurrency,以更好地表達該方法的作用。

您可以編寫一個調用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);
}

演示

這遠非理想,只有在您沒有其他方法可以測試相關功能時(例如,當您無法控制執行輸出的部分代碼時),才應使用此方法。

另一方面,這種方法使您可以測試必須進行某些打印的代碼的副作用,因此在您的測試必須確保輸出到System.out情況下,這可能是相關的。

這種情況的一個很好的選擇是擴展Dollar (或一個繼承類)進行測試。 然后,當調用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!";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM