Ant*_*lev 3 java testing spring mockito
我有一个我这样嘲笑的课:
@Mock
private MyClass1 mockMyClass1;
Run Code Online (Sandbox Code Playgroud)
说这个类看起来像这样:
public class MyClass1 {
@Autowired
private MyInnerClass myInnerClass;
}
Run Code Online (Sandbox Code Playgroud)
当我嘲笑时MyClass1,MyInnerClass会被初始化为null.是否可以用另一个模拟对象来初始化该私有字段?我想myInnerClass成为像这样的模仿者:
@Mock
private MyInnerClass myInnerClass;
Run Code Online (Sandbox Code Playgroud)
如果我使用以下代码:
@InjectMocks
private MyClass1 mockMyClass1;
@Mock
private MyInnerClass myInnerClass
Run Code Online (Sandbox Code Playgroud)
这将初始化私有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;
}
}
Run Code Online (Sandbox Code Playgroud)
现在考虑mock模拟该类.如果你打电话mock.getMyInnerClass(),那不是真正要调用的方法.它的回报不是价值myInnerClass.它将返回null,或者如果您已经使用了该方法
when(mock.getMyInnerClass()).thenReturn(something);
Run Code Online (Sandbox Code Playgroud)
然后它会回来something.
所以回答你的问题:你不能这样做,因为这不是模拟的工作方式.
| 归档时间: |
|
| 查看次数: |
3214 次 |
| 最近记录: |