附 英文版 中文版 电子书
360网盘: http://yunpan.cn/c3ISX4cRsqcMU 访问密码 67b9
合我们的利益诉求。
这半句为了和上一页接上。但是不够特别通顺。这一段最后一句话重新翻译:
测试第三方代码并非我们的职责所在,但是为我们使用到第三方代码写测试代码对我们最有好处。
假如我们并不知道怎么使用我们的第三方库。我们可能需要花费一天或者两天(甚至更长)的时间来阅读其文档才搞懂怎样去使用它。然后我们利用第三方代码来编写我们的代码,并判断它是否按照我们设想的来执行。由此我们停滞在尝试找出bug是出自我们的代码还是第三方代码里面的漫长的调试阶,就不足为奇了。
学习第三方代码不容易。整合第三方代码也很难。学习的同时又整合代码难度更是双倍。如果我们另辟蹊径怎样?不是实验和尝试在我们产品代码中加入新的东西,而是去写测试来加深我们对第三方代码的理解。Jim Newkirk称这种测试为学习性测试。
因为我们想在我们的应用上使用第三方库,所以在学习性测试中我们称第三方(库)为API。我们本质上是通过可控的实验来验证我们对API的理解。实验重点关注我对API本身以外的需求。
8.3学习log4j
比起我们自己定制日志记录器,我们更倾向于使用apache公司的log4j包。我们下载log4j包,并打开其介绍功能的文档页面。在没有充分阅读文档的情况下,我们写第一个测试用例,期待它能够写“hello”这个单词到控制台。
@Test
public voidtestLogCreate() {
Logger logger =Logger.getLogger("MyLogger");
logger.info("hello");
}
运行它的时候,日志记录器产生一个错误,提示我们需要一个叫Appender(日志目的地)的东西。稍微读了一下文档,我们发现有一个叫ConsoleAppender的类。所以我们创建一个ConsoleAppender ,看看这样是否已经解开了输入到控制台的秘密。
@Test
public voidtestLogAddAppender() {
Logger logger =Logger.getLogger("MyLogger");
ConsoleAppender appender= new ConsoleAppender();
logger.addAppender(appender);
logger.info("hello");
}
这次我们发现Appender并没有输出流。奇怪—逻辑上它应该有一个输出流才对。通过在谷歌上一番搜索后,我们尝试对代码作如下修改:
@Test
public voidtestLogAddAppender() {
Logger logger =Logger.getLogger("MyLogger");
logger.removeAllAppenders();
logger.addAppender(newConsoleAppender(
newPatternLayout("%p %t %m%n"),
ConsoleAppender.SYSTEM_OUT));
logger.info("hello");}
问题搞定了,一个包含“hello”的日志信息在控制台出现了!似乎很奇怪我们必须告诉ConsoleAppender让它写入到控制台。
有趣的是,当我们移除ConsoleAppender.SystemOut这个参数,“hello”仍然可以打印
出来。但是当我们移除PatternLayout(格式化布局器),它仍然提示我们缺少输出流。这非常奇怪。
如果我们更仔细的阅读文档会发现,默认的ConsoleAppender构造器是“未配置(输出流)”的,但是这点并不显眼也没啥益处。在log4j中,这点更像是一个bug或者至少也是前后矛盾的。
通过更多的谷歌搜索以及阅读文档和测试,我们最终以列表8-1代码来结束这个示例。
我们已经对log4j的工作方式有了一些了解。我们将这部分知识展现在一个简单的单元测试集中。
Listing 8-1
LogTest.java
public class LogTest {
private Logger logger;
@Before
public void initialize() {
logger = Logger.getLogger("logger");
logger.removeAllAppenders();
Logger.getRootLogger().removeAllAppenders();
}
@Test
public void basicLogger() {
BasicConfigurator.configure();
logger.info("basicLogger");
}
@Test
public void addAppenderWithStream() {
logger.addAppender(new ConsoleAppender(
new PatternLayout("%p %t %m%n"),
ConsoleAppender.SYSTEM_OUT));
logger.info("addAppenderWithStream");
}
@Test
public void addAppenderWithoutStream() {
logger.addAppender(new ConsoleAppender(
new PatternLayout("%p %t %m%n")));
logger.info("addAppenderWithoutStream");
}
}
既然现在我们已经了解了怎样对一个简单的控制台日志输出器初始化,那么我们就可以将其封装到我们自己的日志输出器中,以便应用中其他部分能够与log4j边界接口隔离开来。
————————————————
版权声明:本文为CSDN博主「明明如月学长」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/w605283073/article/details/50353014