当前位置: 首页 > 面试题库 >

Java 用于System.out.println()的JUnit测试

柴正祥
2023-03-14
问题内容

我需要为设计欠佳的旧应用程序编写JUnit测试,并且正在向标准输出中写入许多错误消息。当getResponse(String request)方法正确运行时,它将返回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());

问题答案:

使用ByteArrayOutputStreamSystem.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输出版本字符串等)



 类似资料:
  • 问题内容: 我正在尝试为自定义方面编写Junit测试。这是Aspect类代码片段: 因此,只要关节点与切入点匹配,上述方面就会截获。它的工作正常。 但是我的问题是如何对该类进行单元测试。我有以下Junit测试: 因此,我在Junit中匹配切入点时被其拦截。但是,当调用该联合点时,我应该如何确定(可能是通过断言)我正在拦截? 我不能断言返回值,因为它除了执行联合点外没有其他特殊之处。因此,无论是按方

  • 问题内容: 我在一个项目中工作,我们必须为我们所有的简单bean(POJO)创建单元测试。如果POJO由getter和setter组成,那么是否有必要为其创建单元测试?假设POJO大约100%的时间都可以正常工作吗? 问题答案: TDD中的规则是“测试所有可能破坏的东西” 吸气剂可以破坏吗?通常不会,因此我不必费心测试。此外,我的代码 做 测试肯定会调用吸气所以它 会 被测试。 我个人的规则是,我

  • DAO类的相关方面如下 我的src/test/resources/application.properties文件如下所示 在Eclipse中作为JUnit测试运行的跟踪 应用程序结构 -SRC ----application.java ----COM ----Hitstpa ----application.properties --测试 ---爪哇

  • 我正在尝试从Spring Boot应用程序中的JUnit中访问application.properties或application-test.properties。 com.myservice.config.AppConfig: 主/资源/应用程序.属性: test.resources/application-test.properties JUnit类可以从main/resources/appl

  • 问题内容: 我正在对项目上的纯Java文件运行纯JUnit4 Java测试,但是如果不手动将其公开,我将找不到一种清晰使用@VisibleForTesting的方法。 例如: 方法必须是使其对测试“公开”,但是在那种情况下,注释没有意义吗?如果批注什么也不做,为什么不只使用注释呢? 问题答案: 标签本身可以帮助短绒棉子识别不需要的访问。 为了降低使用风险直接,添加此方法是在 科特林 或在 Java

  • 问题内容: 我正在使用JUnit编写集成测试,以自动化基于控制台的应用程序的测试。该应用程序是家庭作业,但这不是家庭作业。我想使这些测试自动化以提高生产率- 我不想回头再重新测试应用程序中已经测试过的部分。(使用单元测试的标准原因) 无论如何,我找不到或找不到有关捕获输出的文章,因此我不能这样做,也不能提供自动输入。我不在乎输出/输入是否进入控制台/输出窗格。我只需要执行测试并验证输出是否与输入相