繁体   English   中英

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

[英]How to use InjectMocks if the instance to be injected has a final class

我想用Mockito测试一些服务。 这些服务基于CDI,但是不幸的是,使用了字段注入,我无法更改。

public class Service {
   @Inject Logger logger;

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

现在,使用@InjectMocks@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。 但是再次不幸的是,Logback的Logger实现是最终的,因此我无法对此进行监视,它会导致运行时异常。

我想到的解决方法:

  • 使用反射来初始化服务上的logger属性(可怜的人注射)
  • 实现一个间谍(非最终)记录器包装器,该包装器委派给最终的logback记录器

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM