我想测试一个Spring bean A ,当然,这个bean是一个
上下文,并使用其他bean进行操作。
在此测试中,我要模拟一个特定的豆 B ,并注意 B 不会注入到 A (我可以使用@InjectMocks
和@Mock
注释轻松地处理这种情况), B 被注入到 C 中,而注入到 D ,它被注入到 A 。
在测试类 A 时,我只能模拟 B 吗? 你怎么能做到这一点?
答案 0 :(得分:2)
假设测试类使用@RunWith(MockitoJUnitRunner.class)
注释,您可以尝试以下方法:
@Mock
private B b;
@InjectMocks
@Spy
private C c = new C();
@InjectMocks
@Spy
private D d = new D();
@InjectMocks
private A a = new A();
快速解释:B将被嘲笑。 C和D将使用new创建(此处没有模拟,因此我们用@Spy
标记)。 @InjectMocks
将在C中注入B,在D中注入C,在A中注入D。希望能有所帮助。我的此代码(只是示例应用程序代码)here中提供了一个更完整的示例。请注意,真实对象和模拟对象是如何注入到同一类中的。
如果您使用的是SpringRunner
,则另一种方法是:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {A.class, Bmock.class, C.class, D.class})
其中Bmock.class
是您已经在项目中某处创建的模拟。这种方法还假定您已经正确地分离了接口和实现:只有在将B接口自动装配到D(而不是B具体类)中时,它才有效。
答案 1 :(得分:0)
这就是您的依赖项的样子-
B-> C-> D-> A
由于您要测试Bean A,因此唯一要模拟的是D
,而不必理会D
的需求。 Mockito将为您完成这项工作。
如果要测试A
,您想模拟B
和C
之类的所有依赖项,那就错了。