Java 测试该方法是否被调用
非常非常简单的类:Java 测试该方法是否被调用,java,unit-testing,junit,Java,Unit Testing,Junit,非常非常简单的类: public class ConsoleHandler { public void write(String message) { System.out.println(message); } } 当我调用write(“hello”)时,如何测试调用了System.out.println(“hello”)?还有,这个单元测试值得吗 不,这个单元测试不值得花时间或磁盘空间。单元测试是为了确保逻辑正确。如果没有逻辑,那么测试将一无所获。其成本
public class ConsoleHandler {
public void write(String message) {
System.out.println(message);
}
}
当我调用
write(“hello”)
时,如何测试调用了System.out.println(“hello”)
?还有,这个单元测试值得吗 不,这个单元测试不值得花时间或磁盘空间。单元测试是为了确保逻辑正确。如果没有逻辑,那么测试将一无所获。其成本效益比是无限的
如果方法具有分支逻辑、循环或异常处理,则应该对其进行单元测试。但如果它所做的只是调用另一个方法,那么就忘了它。确定方法X是否调用方法Y的最佳方法是查看代码
话虽如此,如果你坚持要测试这个,你应该使用
System.setOut
方法,通过一个ByteArrayOutputStream
传递一个你包装在打印流中的,然后在最后验证底层字节[]
的内容。你可以使用Mockito()模拟类和接口
也就是说,您首先不应该使用Sysout。使用Log4J之类的记录器或SLF4J()之类的日志外观。SLF4J有一个测试框架,使测试更容易()
当然,还可以使用JUnit或TestNG来设置测试用例。至于是否值得测试,这取决于输出的原因。我通常在编写命令行实用程序时进行test System.out调用,因为这是用户界面,文本输出很重要。这甚至不难做到——只需要普通的Java代码
下面的技术显示了如何捕获System.out的值。您甚至不需要模拟框架。请注意,它存储了“real”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());
}
}
对于您的第一个问题“当我调用write(“hello”)时,如何测试它”,将调用System.out.println(“hellow”)
您可以使用并遵循此答案中的说明:
对于你的第二个问题“这个单元测试值得吗?”因为测试是,不,它没有意义。但是,您可以将其用作模板,在将来检查是否调用了任何方法。如果您想要某种代码覆盖工具,如Clover,请不要尝试这样做yourself@AmirAfghani,我已经有了一个,谢谢你的提示:)这是正确的方法,尽管这是你不应该做的事情+1.我在运行测试时遇到了一个ComparisonFailure
错误,我将“hellow”改为“hello”,因为我认为这是一个打字错误。这可能就是原因。也可能是换行的不同。如果不是,则显示断言失败的实际文本。这就说明了比较的失败之处。(我在我的机器上运行了这个代码,所以它肯定在某个地方工作)是的,它将是“\n”
-毫无疑问OP是在Windows或Mac上运行的。然后在最后一行将“hello\n”
更改为“hello”+System.lineSeparator()
。我感谢您的输入,但实际上我正在编写自己的日志框架:)(这是一项任务)