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