很简单的课程:
public class ConsoleHandler {
public void write(String message) {
System.out.println(message);
}
}
如何在致电write("hello")
时测试,System.out.println("hello")
被调用?而且,这个单元测试甚至值得吗?
答案 0 :(得分:4)
至于是否值得测试,这取决于你输出的原因。我通常在编写命令行实用程序时测试System.out调用,因为这是用户界面,文本输出很重要。它甚至都不难做 - 只是常规的Java代码。
以下技术显示了如何捕获System.out的值。你甚至不需要一个模拟框架。请注意,它存储"真实" System.out所以它可以把它放回到最后。如果你不这样做,你的其他测试/代码很快就会变得混乱。
import static org.junit.Assert.*;
import java.io.*;
import org.junit.*;
public class ConsoleHandlerTest {
private PrintStream originalSysOut;
private ByteArrayOutputStream mockOut;
@Before
public void setSysOut() {
originalSysOut = System.out;
mockOut = new ByteArrayOutputStream();
System.setOut(new PrintStream(mockOut));
}
@After
public void restoreSysOut() {
System.setOut(originalSysOut);
}
@Test
public void outputIsCorrect() {
new ConsoleHandler().write("hello");
assertEquals("message output", "hello".trim(), mockOut.toString().trim());
}
}
答案 1 :(得分:2)
不,这个单元测试不值得花时间或磁盘空间。单元测试是为了确保你的逻辑正确。如果没有逻辑,那么测试就无法获得。它的成本效益比是无限的。
如果方法具有分支逻辑,循环或异常处理,则应对其进行单元测试。但如果只是调用另一种方法,那么就算了。找出方法X是否调用方法Y的最佳方法是查看代码。
话虽如此,如果您坚持对此进行测试,则应使用System.setOut
方法,传递ByteArrayOutputStream
包裹的PrintStream
,然后验证最后的基础byte[]
的内容。
答案 2 :(得分:0)
您可以使用Mockito(http://code.google.com/p/mockito/)等库来模拟类和接口。
那就是说,你不应该首先使用Sysout。使用Log4J等记录器或SLF4J(http://www.slf4j.org/)等日志记录。 SLF4J有一个测试框架,可以使测试更容易(http://projects.lidalia.org.uk/slf4j-test/)
当然,JUnit或TestNG可以设置您的测试用例。
答案 3 :(得分:0)
第一个问题"当我调用write(" hello")时,如何测试它,调用System.out.println(" hellow")? #34;
您可以使用Mockito并按照此回答中的说明操作:Mockito : how to verify method was called on an object created within a method?
对于你的第二个问题"这个单元测试是否值得呢?"测试是,不,它没有意义。但是,您可以将其用作模板,以后检查是否有任何方法被调用。