在Spring上下文中模拟bean

时间:2018-08-07 10:44:59

标签: java spring mocking mockito

我想测试一个Spring bean A ,当然,这个bean是一个
上下文,并使用其他bean进行操作。

在此测试中,我要模拟一个特定的豆 B ,并注意 B 不会注入到 A (我可以使用@InjectMocks@Mock注释轻松地处理这种情况), B 被注入到 C 中,而注入到 D ,它被注入到 A

在测试类 A 时,我只能模拟 B 吗? 你怎么能做到这一点?

2 个答案:

答案 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,您想模拟BC之类的所有依赖项,那就错了。