Java 单元测试如何断言(检查)控制台输出

关于在 JUnit 单元测试中如何断言某个函数的控制台输出已是我一个长久的问题. 虽然有控制台输出的函数有了副作用, 不能称之为一个纯函数, 在讲求函数式编程的今天, 纯函数是最好测试的, 所谓的 Data In, Data Out. 但总还是有这样的需求, 比如自己实现的某个日志框架的 Appender, 需要验证它向控制台的输出内容.

我先前在项目中的办法是, 先把把标准输出定向到一个 ByteArrayOutputStream 中去, 完后把这个流转成字符串来断言它的内容, 最后恢复标准输出为 System.out, 代码如下:

ByteArrayOutputStream output = new ByteArrayOutputStream();
System.setOut(new PrintStream(output));

System.out.print("Hello");

assertThat(output.toString(), is("Hello");
System.setOut(System.out);

这样也能完成任务, 本质也是对的, 但稍显复杂了些. 今天读 Spring in Action 一书, 发现它用了 StandardOutputStreamLog 这个 JUnit 的 @Rule, 来自于 System Rules. 其实 StandardOutputStreamLog 类已不推荐使用, 取而代之的是 SystemOutRule, 所以应用 SystemOutRule 来断言控制台输出的测试方法就是 阅读全文 >>

原文地址:http://blog.51cto.com/unmi/2123373

时间: 2024-10-09 19:08:09

Java 单元测试如何断言(检查)控制台输出的相关文章

【Java】控制异常在控制台输出

每次在Java程出现问题,总会抛出一大堆异常,让人眼花缭乱,在Javaweb编程的时候尤甚,让人很难找到出错的位置, 尤其在你网络工程文件多.插件多.框架的时候,各种插件.框架连锁,导致你更难找到出错的位置. 其实异常在控制台输出是可以控制的. 关键是利用到,这个方法与数组.对象都是java自带的,不用引入任何东西: StackTraceElement[] stacks = new Throwable().getStackTrace(); 这个操作. 先看一段程序, public static

Java基础知识强化之集合框架笔记36:List练习之键盘录入多个数据在控制台输出最大值

1. 键盘录入多个数据,以0结束,要求在控制台输出这多个数据中的最大值 分析: •  创建键盘录入数据对象 •  键盘录入多个数据,我们不知道多少个,所以用集合存储 •  以0结束,这个简单,只要键盘录入的数据是0,我就不继续录入数据了 •  把集合转成数组 •  对数组排序 •  获取该数组中的最大索引的值 2. 代码实现: 1 1. package cn.itcast_03; 2 3 import java.util.ArrayList; 4 import java.util.Arrays;

java控制台输出print和println详解

在使用java编程的过程中,控制台输出用得不少,今天我想梳理一下,print.println.printf三者的区别. 一.print 通过System.out.print方法调用,print方法的参数有很多种:boolean.char.char[].String.int.float.double.long等. print的输出末尾不换行. 1.print(boolean b) 打印boolean类型时,输出只有true和false两种.我们查看print(boolean b)的源代码,可以看到

【Java】Eclipse新建的Java文件自动生成主函数、控制台输出行数不再受限制

一.新建的Java文件自动生成主函数 虽然只是一个很简单的事情,但应该还是有人不知道了,每次新建Java文件都要手动输入public static void main(String args[]){},非常麻烦,其实Eclipse可以自动生成这行,只是大多数的Java文件都是没有主函数的,所以这行默认关闭, 右击Java项目下的src可以选择New->Class也就可以新建类 然后在弹出的对话框上勾上自动产生主函数,点击确认,在生产的Java文件中就有主函数了 二.Eclipse控制台输出行数不

如何用java编程在控制台输出当前时间

如何用java编程在控制台输出当前时间 package com.chimp4.p155; import java.text.SimpleDateFormat; import java.util.Date; public class Account { /** * 日期格式化 * @author young * */ public static void main(String[] args) { // 在构造器中传入日期样式 // SimpleDateFormat sdf=new SimpleD

java项目中eclipse控制台输出log4j的信息

最近做的一个hadoop项目中,用MR实现了一个比较复杂的问题,其中的日志信息都是使用的是log4j来处理的.但不知怎么控制台不输出日志信息,只能输出System.out.println()信息,这个调试带了很多的麻烦 再次记录一下,怎么在控制台输出日志信息. 在debug模式中,选择Arguments,在底下的VM arguments中输入“-Dlog4j.debug”即可.如下图

Java代码工具箱之控制台输出重定向_控制台输出到文件

1. 情形:有时候控制台输出太多,在MyEclipse显示不全. 2. 说明:本代码只会重定向 system.out 的内容, error及其它不受代码影响.其它应该类似. 1 //自定导入必要库 2 //然后往 Main 的 最开始一塞即可 3 //文件是否会自动新建,未测试 4 5 try { 6 System.setOut(new PrintStream(new FileOutputStream("D:\\systemOut.txt"))); 7 } catch (FileNot

Java单元测试(Junit+Mock+代码覆盖率)

原文见此处 单元测试是编写测试代码,用来检测特定的.明确的.细颗粒的功能.单元测试并不一定保证程序功能是正确的,更不保证整体业务是准备的. 单元测试不仅仅用来保证当前代码的正确性,更重要的是用来保证代码修复.改进或重构之后的正确性. 一般来说,单元测试任务包括 接口功能测试:用来保证接口功能的正确性. 局部数据结构测试(不常用):用来保证接口中的数据结构是正确的 比如变量有无初始值 变量是否溢出 边界条件测试 变量没有赋值(即为NULL) 变量是数值(或字符) 主要边界:最小值,最大值,无穷大(

Java单元测试(Junit+Mock+代码覆盖率)---------转

Java单元测试(Junit+Mock+代码覆盖率) 原文见此处 单元测试是编写测试代码,用来检测特定的.明确的.细颗粒的功能.单元测试并不一定保证程序功能是正确的,更不保证整体业务是准备的. 单元测试不仅仅用来保证当前代码的正确性,更重要的是用来保证代码修复.改进或重构之后的正确性. 一般来说,单元测试任务包括 接口功能测试:用来保证接口功能的正确性. 局部数据结构测试(不常用):用来保证接口中的数据结构是正确的 比如变量有无初始值 变量是否溢出 边界条件测试 变量没有赋值(即为NULL) 变