我正在为使用与此类似的记录器的遗留代码编写单元测试:
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
来自使用记录器的测试代码。
我的目标是在测试时测试遗留代码,而不依赖于记录器(已初始化或未初始化)。
可能的解决方案:
MyLogger.init()
的调用 - 由于许多原因导致错误解决方案。getLogger
中初始化记录器 - 我不喜欢此解决方案,因为getLogger
必须处理“异常”和“#Ex; 我选择了解决方案#3,但这需要我从Logger继承,它有大约60个函数,并调用它的构造函数,并仔细检查从我的代码调用记录器的哪些方法,所以我可以选择一个正确的& #34;空"实施
我的问题有更好的解决方案吗?
答案 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”);
 }
}
 代码>