当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何将模拟对象注入另一个已经模拟过的对象》经验,为你挑选了1个好方法。

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

@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

这将初始化私有MyInnerClassMyClass1成为嘲笑的对象,但这种方式mockMyClass1是不是模仿本身更多的,是不是(我只注入真正的类中的嘲笑对象,就像@Autowired将注入一个真正的对象是INSITE )?你能纠正我的逻辑,如果我错了,在我的理解@InjectMock@Mock?我怎么能在另一个模拟对象中注入一个模拟对象(不使用setter/constructors)?



1> Tunaki..:

你误解了模拟是什么.

在进行模拟时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.

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


@MateuszDryzek模拟类没有变量的概念.没了.噗.您只定义模拟的行为.调用其方法时应该怎么做.真正的类的真正代码已不复存在.
推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有