如何测试使用需要初始化的记录器的遗留代码?

时间:2015-07-25 10:42:15

标签: java unit-testing logging

我正在为使用与此类似的记录器的遗留代码编写单元测试

public class MyLogger {
    private static Logger logger;

    public static void init() throws SomeException {
        //initialize the logger field
    }

    public static Logger getLogger() {
        return logger;
    }
}

记录器需要初始化,否则返回null,测试失败,因为NullPointerException来自使用记录器的测试代码。

我的目标是在测试时测试遗留代码,而不依赖于记录器(已初始化或未初始化)。

可能的解决方案:

  1. 在测试中添加对MyLogger.init()的调用 - 由于许多原因导致错误解决方案。
  2. 如果记录器尚未初始化,请在getLogger中初始化记录器 - 我不喜欢此解决方案,因为getLogger必须处理“异常”和“#Ex;
  3. 使用" NullLogger"初始化记录器。什么也没做。
  4. 我选择了解决方案#3,但这需要我从Logger继承,它有大约60个函数,并调用它的构造函数,并仔细检查从我的代码调用记录器的哪些方法,所以我可以选择一个正确的& #34;空"实施

    我的问题有更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

使用模拟框架创建 NullLogger 。您可以使用“Mockito”或“PowerMock”或“EasyMock”或任何其他框架。





Mocked 对象是自动生成的子类,其行为可以通过编程方式定义。默认情况下,模拟对象的功能将不执行任何操作并返回null(对于非void方法)。





您可能希望将记录器字段更改为包隐私,以便能够从测试中设置它而不必使用反射。





使用Mockito 1.9.5的示例代码:




  import java.util.logging。*;
 import org.junit.Test;
 import org.mockito.Mockito;

 class SomeException extends Exception {&#xA ;
}

类MyLogger
 {
静态记录器记录器; //改为包隐私
 public static void init()抛出SomeException {
 //初始化记录器字段
 }
 public static Logger getLogger(){
返回记录器;
 }
}

公共类MyLoggerTest {

 @测试
 public void someTest(){

 //设置“NullLogger”
 MyLogger.logger = Mockito.mock(Logger.class);

 //访问记录器不会再失败
 MyLogger.getLogger()。log(Level.SEVERE,“uninteresting stuff”);
 }
}