我使用工厂模式。我有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,但我不被允许。
答案 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);
}
这远非理想,只有当您没有其他方法来测试相关功能时才应该使用它 - 例如,当您无法控制执行输出的部分代码时。
另一方面,这种方法可以让您测试必须进行某些打印的代码的副作用,因此在您的测试必须确保输出到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!";