【问题标题】:System.out.print() doesn't show anything in test methodsSystem.out.print() 在测试方法中不显示任何内容
【发布时间】:2015-06-11 21:23:18
【问题描述】:

我试图在我的单元测试 (@Test mehotds) 中使用 System.out 打印一些数据,但它没有显示任何内容。但是,它在@Before 方法中可以正常工作。我正在使用带有 Maven Surefire 插件的 JUnit。

public class MyTests {

  @Before
  void init(){

    System.out.println("Initializing some data..."); // <- It works.

  }

  @Test
  void shouldRemoveSeries() {

    System.out.println("TEST: Should remove series"); // <- It doesn't.

  }
}

maven-surefire-plugin配置:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.15</version>
  <configuration>
    <includes>
      <include>**/*Tests.java</include>
    </includes>
  </configuration>
</plugin>

谢谢。

【问题讨论】:

  • 澄清一下:你为什么使用 System.out.println() 而不是 Logger?后者是为你写的目的而设计的
  • 您是否尝试过以: test 开头的测试名称?有需要这个的 JUnit 版本。
  • 作为 Junit 测试或 Maven 测试运行
  • 看看@gclaussn的回答。
  • 您应该更改测试的名称,而不是 maven-surefire-plugin 的配置。遵守约定。

标签: java maven junit


【解决方案1】:

Maven 的-Dtest=* 命令行选项似乎触发了单元测试中标准输出的显示。

按照惯例,标准输出显示在target/surefire-reports/*-output.txt 中。显然,Surefire 插件开发人员无法重用标准输出来在测试和框架之间进行许多通信。

【讨论】:

    【解决方案2】:

    我正在使用gradleSystem.outjava.util.logging.Logger 都有这个问题。我编辑了build.gradle 文件的以下部分:

    test {
      testLogging {
        exceptionFormat = 'full'
        events = ["passed", "failed", "skipped"]
      }
    }
    

    并在testLogging 下添加了showStandardStreams = true。结果如下:

    test {
      testLogging {
        exceptionFormat = 'full'
        events = ["passed", "failed", "skipped"]
        showStandardStreams = true
      }
    }
    

    它修复了它们。

    【讨论】:

    • 在 gradle 6.6.1 上我不得不使用 --info
    【解决方案3】:

    我在单独的非测试类中做了一些小把戏。它没有记录器那么流畅,但是如果您正在寻找 Spring Boot 中的快速解决方案,您可以使用它。

    PrintForTest.java

    import org.springframework.stereotype.Controller;
    
    @Controller
    public class PrintForTest {
    
        public static void print(String input){
            System.out.println(input);
        }
    }
    

    MainTest.java

    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.junit.Assert;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    @SpringBootTest
    @RunWith(SpringRunner.class)
    public class MainTest {
    
    ...
    
        @Test
        public void testingSomething(){
            PrintForTest.print("My new System.out.print()");
            Assert.assertEquals(...);
        }
    }
    

    已编辑:使用静态方法,无需使用@Autowired。

    【讨论】:

    • 我看不出您的代码与仅使用 System.out.println("My new System.out.print()"); 之间有任何区别。为什么通过 Spring bean 打印时它可以工作?
    • 我不知道为什么它在测试方法中不起作用。无论如何,在这种情况下 System.out.print 被从测试方法中调用,这解决了我的问题。
    • 感谢您的回答!
    【解决方案4】:

    也遇到了这个问题。我正在使用 gradle 来管理我的任务,并将其放在 build.gradle 文件的末尾:

    test {
      testLogging.showStandardStreams = true
    }
    

    现在我看到了System.out.println(whateves)

    【讨论】:

    • 我需要提一下,gradle中没有使用=符号,应该只是testLogging.showStandardStreams true
    • 这是从 2016 年的工作代码中复制和粘贴的。YMMV,所以也许不再需要使用 = 了?你要承担风险。 :)
    • 不知道。如果您使用 kotlin 格式而不是 build.gradle 的默认 groovy 格式,可能需要它。
    • @AndreiChernikov 在 Java 格式的 build.gradle 中使用了 = 符号。
    • 也适用于 JUnit 5。
    【解决方案5】:

    要通过 System.out.println 获取书面测试的输出,您需要配置 maven-surefire-plugin 以将此输出重定向到文件中,这可以通过以下方式实现:

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>2.18.1</version>
      <configuration>
        <redirectTestOutputToFile>true</redirectTestOutputToFile>
      </configuration>
    </plugin>
    

    redirectTestOutputToFile 选项会将 System.out.println 等的输出重定向到一个单独创建的文件中:

    文档摘录:

    将此设置为“true”以将单元测试标准输出重定向到文件 (在报告目录/testName-output.txt 中找到)。

    除此之外,System.out.println 通常在单元测试中没有意义。

    【讨论】:

      【解决方案6】:

      这听起来对我来说很熟悉,所以我假设您正在从某个 IDE(Netbeans?)运行您的测试。它可能只显示失败的测试的输出。从控制台运行测试时也会出现这种情况吗?

      使用System.err 而不是System.out 可能会更幸运,但我不确定。

      【讨论】:

        【解决方案7】:

        问题是您的测试类的名称。要在构建中的测试阶段被识别(由 Maven surefire 插件),它必须命名为“*Test”:

        Inclusions and Exclusions of Tests

        【讨论】:

          【解决方案8】:

          使用Log

          private static Logger log = Logger.getLogger(LoggingObject.class);
          log.info("I'm starting");
          

          System.setOut()

          private final PrintStream stdout = System.out;
          private final ByteArrayOutputStream output = new ByteArrayOutputStream();
          private TerminalView terminalview;
          

          【讨论】:

          • 我已经尝试过使用 Logger,但它仍然没有显示任何内容。测试没有通过,我的意思是,它们运行时出错,这可能是日志记录不起作用的原因吗?
          • 你在测试中遇到的任何东西,理论上都将成为被评估的候选者,所以也许测试正在捕获日志作为测试的一部分,这就是为什么 a) 控制台中没有结果 b) 测试未能通过.. . 检查System.setOut() 链接,我将能够创建一个函数来打印您想要的内容,而不会弄乱测试... ;)
          • 它对我不起作用 :( 并且Logger 在 @Before 方法中不起作用,同时 System.out.print() 起作用。
          • 日志链接已损坏。
          • 什么是终端视图?它不是标准的 Java 类。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-10
          • 2012-12-27
          • 1970-01-01
          • 1970-01-01
          • 2015-03-07
          相关资源
          最近更新 更多