![](/img/trans.png)
[英]How to Test Void Method With No Arguments That Prints Line to Console
[英]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.