我想用 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/