测试该方法被调用

时间:2014-05-26 02:20:47

标签: java unit-testing junit

很简单的课程:

public class ConsoleHandler {

    public void write(String message) {
        System.out.println(message);
    }

}

如何在致电write("hello")时测试,System.out.println("hello")被调用?而且,这个单元测试甚至值得吗?

4 个答案:

答案 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?

对于你的第二个问题"这个单元测试是否值得呢?"测试是,不,它没有意义。但是,您可以将其用作模板,以后检查是否有任何方法被调用。