如果要注入的实例具有最终类,如何使用InjectMocks

时间:2014-05-21 12:33:01

标签: java mockito cdi logback

我想用mockito测试一些服务。这些服务基于CDI,不幸的是,使用现场注入,我无法改变。

public class Service {
   @Inject Logger logger;

   public void method() {
      logger.info("some log text");
  }
}

现在使用mockito @InjectMocks注释创建可测试的实例非常容易。它将注入嘲笑和间谍。

@RunWith(MockitoJUnitRunner.class)
public class ServiceTest {
  @Spy Logger logger = LoggerFactory.getLogger(Service.class);

  @InjectMocks Service service;

  @Test public void test() {
     // Given
     // When
     service.method();
     // Then
  }

我需要将一些工作记录器注入我正在测试的服务类中。记录器框架是slf4j,首选记录器是logback。但遗憾的是,Logger的logback实现是最终的,所以我无法监视它,它会导致运行时异常。

我想到的解决方法:

  • 使用反射来初始化服务上的记录器属性(穷人的注射)
  • 实现委托给最终logback记录器的spyable(非最终)记录器包装器

但对于那些(那些)问题,是否有一个干净或至少更好的解决方案?

1 个答案:

答案 0 :(得分:2)

您正在测试的课程很可能错误地使用了Logback。它不应该将logger字段声明为类型ch.qos.logback.classic.Logger,而应该是接口类型org.slf4j.Logger,它由最终的Logback记录器类实现。

这样,您就可以避免这个问题,因为没有final类可以被模拟或注入。