51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1188|回复: 3
打印 上一主题 下一主题

在 JUnit4 中使用 SystemOutRule 获取不到控制台的标准输出内容

[复制链接]
  • TA的每日心情
    无聊
    4 天前
  • 签到天数: 530 天

    连续签到: 2 天

    [LV.9]测试副司令

    跳转到指定楼层
    1#
    发表于 2022-2-23 13:21:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    1测试积点

    自己在练习《Spring实战》第四版这本书的第一章例子时发现在测试部分无法使用 SystemOutRule 获取到 System.out 或者 PrintStream 输出到控制台的内容。

    测试类

    1. import org.junit.Rule;
    2. import org.junit.Test;
    3. import org.junit.contrib.java.lang.system.StandardOutputStreamLog;
    4. import org.junit.contrib.java.lang.system.SystemErrRule;
    5. import org.junit.contrib.java.lang.system.SystemOutRule;
    6. import org.junit.runner.RunWith;
    7. import org.springframework.beans.factory.annotation.Autowired;
    8. import org.springframework.test.context.ContextConfiguration;
    9. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    10. import org.springframework.test.context.junit4.SpringRunner;

    11. @RunWith(SpringJUnit4ClassRunner.class)
    12. @ContextConfiguration(classes = KnightConfig.class)
    13. public class SlayDragonQuestTest {
    14.     @Rule
    15.     public final StandardOutputStreamLog log = new StandardOutputStreamLog();

    16.     @Rule
    17.     public final SystemOutRule systemOutRule = new SystemOutRule().enableLog();

    18.     @Rule
    19.     public final SystemErrRule systemErrRule = new SystemErrRule().enableLog();

    20.     @Autowired
    21.     private Knight knight;

    22.     @Test
    23.     public void shouldBeNotNull() {
    24.         Assert.assertNotNull(knight);
    25.     }

    26.     @Test
    27.     public void writesTextToSystemErr() {
    28.         System.err.print("hello world");
    29.         Assert.assertEquals("hello world", systemErrRule.getLog());
    30.     }

    31.     @Test
    32.     public void shouldBeEqual() {
    33.         systemOutRule.clearLog();
    34.         knight.embarkOnQuest();
    35. //        System.out.println("Embarking on quest to slay the dragon!");
    36.         Assert.assertEquals("Embarking on quest to slay the dragon!\r\n", systemOutRule.getLog());
    37.     }
    38. }
    复制代码

    当我执行下面这个测试方法 shouldBeEqual(),结果显示 SystemOutRule 的 getLog() 方法获取的控制台输出内容是空的。

    1. @Test
    2.     public void shouldBeEqual() {
    3.         systemOutRule.clearLog();
    4.         knight.embarkOnQuest();
    5. //        System.out.println("Embarking on quest to slay the dragon!");
    6.         Assert.assertEquals("Embarking on quest to slay the dragon!\r\n", systemOutRule.getLog());
    7.     }
    复制代码

    点开 Click to see difference

    显示 systemOutRule.getLog() 并没有获取到控制台的输出内容,而第一张结果图显示控制台是有输出内容的。

    配置类

    1. package com.hb.config;

    2. import com.hb.impl.BraveKnight;
    3. import com.hb.impl.SlayDragonQuest;
    4. import com.hb.interfaces.Knight;
    5. import com.hb.interfaces.Quest;
    6. import org.springframework.context.annotation.Bean;
    7. import org.springframework.context.annotation.Configuration;

    8. @Configuration
    9. public class KnightConfig {
    10.     @Bean
    11.     public Knight knight() {
    12.         return new BraveKnight(quest());
    13.     }

    14.     @Bean
    15.     public Quest quest() {
    16.         return new SlayDragonQuest(System.out);
    17.     }
    18. }
    复制代码

    BraveKnight 类和 Knight 接口

    1. public class BraveKnight implements Knight {
    2.     private Quest quest;

    3.     public BraveKnight(Quest quest) {
    4.         this.quest = quest;
    5.     }

    6.     @Override
    7.     public void embarkOnQuest() {
    8.         quest.embark();
    9.     }
    10. }

    11. public interface Knight {
    12.     void embarkOnQuest();
    13. }
    复制代码

    SlayDragonQuest 类和 Quest 接口

    1. package com.hb.impl;

    2. import com.hb.interfaces.Quest;

    3. import java.io.PrintStream;

    4. public class SlayDragonQuest implements Quest {
    5.     private PrintStream stream;

    6.     public SlayDragonQuest(PrintStream stream) {
    7.         this.stream = stream;
    8.     }

    9.     @Override
    10.     public void embark() {
    11.         stream.println("Embarking on quest to slay the dragon!");
    12.     }
    13. }

    14. public interface Quest {
    15.     void embark();
    16. }
    复制代码

    刚开始我以为是构造 SlayDragonQuest 类注入的 PrintStream 有问题,于是我新建了一个程序入口看看 BraveKnight 类的实际输出了什么。

    1. package com.hb;

    2. import com.hb.config.KnightConfig;
    3. import org.springframework.context.annotation.AnnotationConfigApplicationContext;

    4. public class Knight {
    5.     public static void main(String[] args) throws Exception {
    6.         AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(KnightConfig.class);
    7.         com.hb.interfaces.Knight knight = context.getBean(com.hb.interfaces.Knight.class);
    8.         knight.embarkOnQuest();
    9.         context.close();
    10.     }
    11. }
    复制代码

    结果显示

    说明通过 PrintStream 调用 Println() 方法是能够将内容输出到控制台的。那么也就说明了 SystemOutRule 的 getLog() 方法并没有获取到控制台的输出内容。接着我注释了测试方法 shouldBeEqual() 中的 knight.embarkOnQuest(); 而直接使用 System.out.println() 方法。

    1. @Test
    2.     public void shouldBeEqual() {
    3.         systemOutRule.clearLog();
    4. //        knight.embarkOnQuest();
    5.         System.out.println("Embarking on quest to slay the dragon!");
    6.         Assert.assertEquals("Embarking on quest to slay the dragon!\r\n", systemOutRule.getLog());
    7.     }
    复制代码

    结果还是一样失败


    操作系统:Win10
    IDE:Intellij IDEA 2021.1.2
    依赖的包(pom.xml):

    1. <dependencies>
    2.     <dependency>
    3.       <groupId>org.springframework</groupId>
    4.       <artifactId>spring-core</artifactId>
    5.       <version>5.2.15.RELEASE</version>
    6.     </dependency>
    7.     <dependency>
    8.       <groupId>org.springframework</groupId>
    9.       <artifactId>spring-beans</artifactId>
    10.       <version>5.2.15.RELEASE</version>
    11.     </dependency>
    12.     <dependency>
    13.       <groupId>org.springframework</groupId>
    14.       <artifactId>spring-context</artifactId>
    15.       <version>5.2.15.RELEASE</version>
    16.     </dependency>
    17.     <dependency>
    18.       <groupId>org.springframework</groupId>
    19.       <artifactId>spring-context-support</artifactId>
    20.       <version>5.2.15.RELEASE</version>
    21.     </dependency>
    22.     <dependency>
    23.       <groupId>org.springframework</groupId>
    24.       <artifactId>spring-aop</artifactId>
    25.       <version>5.2.15.RELEASE</version>
    26.     </dependency>
    27.     <dependency>
    28.       <groupId>org.springframework</groupId>
    29.       <artifactId>spring-test</artifactId>
    30.       <version>5.2.15.RELEASE</version>
    31.     </dependency>
    32.     <dependency>
    33.       <groupId>org.springframework</groupId>
    34.       <artifactId>spring-jdbc</artifactId>
    35.       <version>5.2.15.RELEASE</version>
    36.     </dependency>
    37.     <dependency>
    38.       <groupId>org.springframework</groupId>
    39.       <artifactId>spring-aspects</artifactId>
    40.       <version>5.2.15.RELEASE</version>
    41.     </dependency>
    42.     <dependency>
    43.       <groupId>junit</groupId>
    44.       <artifactId>junit</artifactId>
    45.       <version>4.12</version>
    46.       <scope>test</scope>
    47.     </dependency>
    48.     <dependency>
    49.       <groupId>org.apache.maven.plugins</groupId>
    50.       <artifactId>maven-project-info-reports-plugin</artifactId>
    51.       <version>3.0.0</version>
    52.       <type>maven-plugin</type>
    53.     </dependency>
    54.     <dependency>
    55.       <groupId>org.mockito</groupId>
    56.       <artifactId>mockito-core</artifactId>
    57.       <version>4.2.0</version>
    58.       <scope>test</scope>
    59.     </dependency>
    60.     <dependency>
    61.       <groupId>org.aspectj</groupId>
    62.       <artifactId>aspectjweaver</artifactId>
    63.       <version>1.9.7</version>
    64.     </dependency>
    65.     <dependency>
    66.       <groupId>log4j</groupId>
    67.       <artifactId>log4j</artifactId>
    68.       <version>1.2.9</version>
    69.     </dependency>
    70.     <dependency>
    71.       <groupId>com.github.stefanbirkner</groupId>
    72.       <artifactId>system-rules</artifactId>
    73.       <version>1.16.0</version>
    74.       <scope>test</scope>
    75.     </dependency>
    76.     <dependency>
    77.       <groupId>org.slf4j</groupId>
    78.       <artifactId>slf4j-simple</artifactId>
    79.       <version>1.7.25</version>
    80.       <scope>test</scope>
    81.     </dependency>
    82.   </dependencies>
    复制代码

    在此请教下各位问题到底出在哪里


    附件: 您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    3 天前
  • 签到天数: 1521 天

    连续签到: 5 天

    [LV.Master]测试大本营

    2#
    发表于 2022-2-24 10:23:38 | 只看该作者
    输出存为变量再比较吧
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    22 分钟前
  • 签到天数: 669 天

    连续签到: 1 天

    [LV.9]测试副司令

    3#
    发表于 2022-2-24 12:25:10 | 只看该作者
    改变一下输出
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2 小时前
  • 签到天数: 2819 天

    连续签到: 1 天

    [LV.Master]测试大本营

    4#
    发表于 2022-2-24 13:24:13 | 只看该作者
    不太清楚
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-25 09:25 , Processed in 0.077333 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表