java - 如果要注入(inject)的实例具有最终类,如何使用 InjectMocks

标签 java mockito cdi logback

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

public class Service {
   @Inject Logger logger;

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

现在使用 mockito 的 @InjectMocks 注释创建可测试实例非常容易。它将注入(inject)模拟和 spy 。

@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
  }

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

我想到的解决方法:

  • 使用反射初始化服务上的记录器属性(穷人注入(inject))
  • 实现一个委托(delegate)给最终 logback 记录器的可监视(非最终)记录器包装器

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

最佳答案

您的被测类很可能错误地使用了 Logback。不要将 logger 字段声明为 ch.qos.logback.classic.Logger 类型,它应该是接口(interface)类型 org.slf4j.Logger,由最终的Logback logger类实现。

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

关于java - 如果要注入(inject)的实例具有最终类,如何使用 InjectMocks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23783282/

相关文章:

java - 通过 CDI 检索单元测试中的替代实体管理器

hibernate - EntityListeners 中的 CDI 注入(inject)

java - 如何从另一个类填充我的数组?(Java)

java - 如何将十六进制字体颜色添加到 JLabel?

java - 测试安卓应用程序。试图模拟 getSystemService。

java - 不使用 InjectMocks 创建对象会导致 httpClient 出现问题

Java Optional.ofNullable 与 Mockito

java - 创建新的实例类引用

java - 为什么以下带有循环泛型的代码无法编译?

java - @Transactional 方法在异常和多线程 Wildfly CDI 上插入值