如何将模拟对象注入另一个已经模拟过的对象

我有一个我这样嘲笑的课:

@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);

然后它会返回一些东西.

所以回答你的问题:你不能这样做,因为这不是嘲笑的工作方式.

上一篇:java – 如何对文件作为参数的方法进行单元测试和模拟


下一篇:java – 我可以使用mockito来匹配具有自动更新时间戳的对象吗?