当前位置: 首页 > 知识库问答 >
问题:

JUnit系统测试。出来println()

燕禄
2023-03-14

我需要为一个设计糟糕的旧应用程序编写JUnit测试,该应用程序正在向标准输出写入大量错误消息。当getResponse(String请求)方法正确运行时,它将返回一个XML响应:

@BeforeClass
public static void setUpClass() throws Exception {
    Properties queries = loadPropertiesFile("requests.properties");
    Properties responses = loadPropertiesFile("responses.properties");
    instance = new ResponseGenerator(queries, responses);
}

@Test
public void testGetResponse() {
    String request = "<some>request</some>";
    String expResult = "<some>response</some>";
    String result = instance.getResponse(request);
    assertEquals(expResult, result);
}

但当它得到格式错误的XML或不理解请求时,它会返回null,并将一些内容写入标准输出。

在JUnit中是否有任何方法断言控制台输出?要捕获以下情况:

System.out.println("match found: " + strExpr);
System.out.println("xml not well formed: " + e.getMessage());

共有3个答案

南宫鸿晖
2023-03-14

而不是重定向系统。在之外,我将重构使用系统的类。出来println()以协作者身份传递PrintStream,然后使用系统。我们在生产中推出了,并在测试中加入了测试间谍。也就是说,使用依赖注入来消除对标准输出流的直接使用。

生产中

ConsoleWriter writer = new ConsoleWriter(System.out));

在测试中

ByteArrayOutputStream outSpy = new ByteArrayOutputStream();
ConsoleWriter writer = new ConsoleWriter(new PrintStream(outSpy));
writer.printSomething();
assertThat(outSpy.toString(), is("expected output"));

讨论

这样,被测试的类就可以通过简单的重构进行测试,而不需要间接重定向标准输出或使用系统规则进行模糊拦截。

湛钊
2023-03-14

我知道这是一个旧的线程,但有一个很好的库来实现这一点:系统规则
文档中的示例:

public void MyTest {
    @Rule
    public final SystemOutRule systemOutRule = new SystemOutRule().enableLog();

    @Test
    public void overrideProperty() {
        System.out.print("hello world");
        assertEquals("hello world", systemOutRule.getLog());
    }
}

它还允许您捕获系统。退出(-1)以及命令行工具需要测试的其他内容。

荀子轩
2023-03-14

使用ByteArrayOutputStream和System。setXXX很简单:

private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
private final ByteArrayOutputStream errContent = new ByteArrayOutputStream();
private final PrintStream originalOut = System.out;
private final PrintStream originalErr = System.err;

@Before
public void setUpStreams() {
    System.setOut(new PrintStream(outContent));
    System.setErr(new PrintStream(errContent));
}

@After
public void restoreStreams() {
    System.setOut(originalOut);
    System.setErr(originalErr);
}

示例测试用例:

@Test
public void out() {
    System.out.print("hello");
    assertEquals("hello", outContent.toString());
}

@Test
public void err() {
    System.err.print("hello again");
    assertEquals("hello again", errContent.toString());
}

我用这个代码来测试命令行选项(断言-version输出版本字符串等)

编辑:这个答案的早期版本称为系统。测试后的放样(空);这就是评论者提到的NullPointerException的原因。

 类似资料:
  • 我是故意在谈论系统测试。我们确实有一套相当详尽的单元测试,其中一些使用了模拟,而这些测试不会去任何地方。系统测试应该是对单元测试的补充,因此,模拟不是一种选择。 如果我将替换为一个test-method(让我们称之为),并引入一个顺序依赖项(使用JUnit 5非常容易),它强制在运行任何其他测试之前运行,那么这些问题就会消失。 到目前为止还好!这看起来和工作很好。当测试不是由CI服务器执行,而是由

  • 主要内容:测试级别的层次结构,系统测试的类型系统测试包括测试完全集成的软件系统。通常,计算机系统是通过软件集成制成的。换句话说,一组软件的计算机系统执行各种任务,但只有软件才能执行任务; 软件必须与兼容的硬件接口。系统测试是一系列不同类型的有目的的测试行使和审查针对需求的集成软件的计算机系统的全部工作。 软件测试分为四个级别:单元测试,集成测试,系统测试和验收测试,所有这些都用于测试目的。单元测试用于测试单个软件; 集成测试用于测试整个系统

  • TestKit 实例 (Scala) 对于任何软件开发,自动化测试都是开发过程中一个重要组成部分。actor 模型对于代码单元如何划分,它们之间如何交互提供了一种新的视角,这对如何编写测试也造成了影响。 Akka 有一个专门的模块——akka-testkit来支持不同层次上的测试,测试很明显有两个类别: 测试独立的、不包括actor模型的代码,即没有多线程的内容;这意味着给事件发生的次序给定,有完

  • 一面: 如何测试微信抢红包 如何测试矿泉水瓶 矿泉水瓶除了能喝水,还能做什么,发挥你的想象力 聊实习,很简单的问了下实习做了什么 如何看待测试 反问 许愿二面 9.16二面: 最近总忘记录音,问题都记不住了,只记住了自己不会的,跟大家分享一下吧: 压力测试和性能测试的原理,以及框架有没有用过 app测试和网页测试的区别在哪 一台300并发和300台单并发测试的区别在哪里 最后还问了一些开放性题目,

  • 上周五做了笔试后,周一就约了面试。面试大概20分钟,首先是自我介绍,然后问了本科成绩和硕士成绩以及有无奖学金,考研or保研,考研成绩是什么位次。这块我完全是debuff ,我本科成绩倒数没有奖学金,然后考研也是勉强上岸哈哈😆。 然后按着简历问了一会儿项目实习,跟测试显然没有任何关系所以很快就结束了。 之后是问了几个技术问题,包括tcp和udp 的区别、osi 、边界测试和一道简单的算法题。面试之

  • 我们有一个服务网格/kubernetes通过终端工作,显示所有不同的pod及其不同的名称空间。在每个pod中,您可以控制台并查看app.jar. 最近,boss/client询问我们如何从service mesh/kubernetes命令行为任何特定的JAR运行各种系统集成测试。谷歌说用mvn全新安装’,‘javac’或者‘Java-jar JUnit-platform-console-stand