【问题标题】:Does @InjectMock replace the bean with a mock in all other beans?@InjectMock 是否用所有其他 bean 中的模拟替换 bean?
【发布时间】:2026-02-08 18:00:01
【问题描述】:
如果我注释
@InjectMock
MyClass myclass;
在测试中,这是否意味着,在所有情况下,其他 bean 都使用 MyClass 的依赖项进行初始化,它们将使用此模拟实例进行初始化?
换句话说,如果我有
@ApplicationScope
class MyClass {
在某个地方,它会被忽略吗?
【问题讨论】:
标签:
java
dependency-injection
mockito
inversion-of-control
【解决方案1】:
我猜你有错字,应该是@InjectMocks。对于您的问题:
这是否意味着,在所有情况下,其他 bean 都使用 MyClass 的依赖项进行初始化,它们将使用这个模拟实例进行初始化?
据我了解,答案是否定的。这个
@InjectMocks
MyClass myclass;
不会创建 MyClass 的模拟,也不会以任何方式使其全局可访问(或在任何地方注入),但是当有任何可用时,它会将其他模拟注入到 MyClass 的实例中。例如,如果您的 MyClass 是这样的:
@Component
public MyClass {
@Resource
private SomeResource someResource;
}
使用@InjectMocks 会有意义:
@Mock
private SomeResource someResource;
@InjectMocks
private MyClass myClass;
那么在myClass 中对someResource 的任何调用实际上都将针对@Mock,然后您可能希望根据需要存根。
MyClass 的实例的创建和模拟的注入分别发生在每个 @Test 上。