System.out.print()在测试方法中没有显示任何内容

时间:2015-04-07 10:02:34

标签: java maven junit

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

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>

感谢。

8 个答案:

答案 0 :(得分:30)

也进入这个。我使用gradle来管理我的任务,并将其放在build.gradle文件的末尾:

test {
  testLogging.showStandardStreams = true
}

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

答案 1 :(得分:9)

要通过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等的输出重定向到单独创建的文件中:

摘自文档:

  

将此设置为&#34; true&#34;将单元测试标准输出重定向到文件   (可在reportsDirectory / testName-output.txt中找到)。

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

答案 2 :(得分:4)

使用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;

答案 3 :(得分:2)

问题是测试类的名称。要在构建中的测试阶段(通过Maven surefire插件)进行识别,必须将其命名为&#34; * Test&#34;:

Inclusions and Exclusions of Tests

答案 4 :(得分:1)

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

使用System.err代替System.out可能会有更多运气,但我对此并不确定。

答案 5 :(得分:1)

我在单独的非测试类中制作了一个小技巧。它不像logger那么顺利,但是如果你在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。

答案 6 :(得分:0)

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

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

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

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

它固定了两个。

答案 7 :(得分:0)

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

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