我有一个我这样嘲笑的课:
@Mock
private MyClass1 mockMyClass1;
说这个类看起来像这样:
public class MyClass1 {
@Autowired
private MyInnerClass myInnerClass;
}
当我模拟MyClass1时,MyInnerClass将被初始化为null.是否可以用另一个模拟对象来初始化该私有字段?我希望myInnerClass像这样一个模拟:
@Mock
private MyInnerClass myInnerClass;
如果我使用以下代码:
@InjectMocks
private MyClass1 mockMyClass1;
@Mock
private MyInnerClass myInnerClass
这会将MyClass1中的私有MyInnerClass初始化为模拟对象,但是这样mockMyClass1不再是模拟本身,不是吗(我只是在真实类中注入一个模拟对象,就像@Autowired会注入一样一个真实的物体,它)?如果我对@InjectMock和@Mock的理解错了,你能纠正我的逻辑吗?我怎么能在另一个模拟对象中注入一个模拟对象(不使用setter / constructors)?
解决方法:
你误解了mock是什么.
当您模拟MyClass1时,模拟对象不再存在MyInnerClass类型的内部字段.因此,尝试将某些内容注入模拟中是没有意义的.
模拟是通过说明与它交互时应该做什么来控制的.您将其公共方法存根以执行您希望它们执行的操作.你给出了行为.唯一的默认行为(可能特定于Mockito)是在没有配置模拟时返回null(但请注意它不返回null因为某些内部变量为null,它返回,因为Mockito决定那就是它应该返回;也许另一个模拟框架决定它应该抛出异常,谁知道?).
作为一个例子,考虑你的真正的类是:
class MyClass1 {
private MyInnerClass myInnerClass;
public MyInnerClass getMyInnerClass() {
return myInnerClass;
}
}
现在考虑模拟该类的模拟.如果调用mock.getMyInnerClass(),则不是将要调用的实际方法.它将返回的不是myInnerClass的值.它将返回null,或者如果您使用了该方法
when(mock.getMyInnerClass()).thenReturn(something);
然后它会返回一些东西.
所以回答你的问题:你不能这样做,因为这不是嘲笑的工作方式.