Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 测试该方法是否被调用_Java_Unit Testing_Junit - Fatal编程技术网

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()
。我感谢您的输入,但实际上我正在编写自己的日志框架:)(这是一项任务)