【发布时间】:2021-08-18 20:16:24
【问题描述】:
我有一个类,我在其中添加了依赖项作为构造函数注入以及字段注入
@service
public class MyService {
private final ClientOne clientOne;
private final ClientTwo clientTwo;
@Autowired
private SpecialClient specialClient;
public MyService(ClientOne clientOne,
ClientTwo clientTwo){
this.clientOne=clientOne;
this.clientTwo=clientTwo;
}
当我编写测试用例时,如果我在 MyService 上使用 @InjectMock ,则在混合类型的依赖关系的情况下,Mockito 将使用 Constructor 来创建 Mock 并且我的 SpecialClient 将为空。
SpecialClient 一个内部依赖,所以我没有它的 setter,它也是私有的。
解决方法
现在我在上面的类中将 specialClient 包设为私有(在 specialClient 之前删除私有)
然后在使用构造函数代码创建对象后在目标类中显式设置模拟,如下所示。
但实际上这应该是私有的,我仍然可以使用一些 ReflectionUtils 在 setup 方法中设置私有字段,但这也是另一个 Hack。
问题是
有没有办法 Mockito 为这种情况提供解决方案。初始化所有依赖项?
class MyServiceTest{
MyService myService;
@Mock
ClientOne clientOne
@Mock
ClientTwo clientTwo
@Mock
SpecialClient specialClient
@BeforeAll
void setup(){
myService = new MyService(clientOne,clientTwo);
myService.specialClient=specialClient;
}
}
不,我不能将 specialClient 添加为构造函数 Arg,它实际上是一个 requestScope 依赖项。
【问题讨论】:
标签: spring junit mockito autowired