使用 mockito 进行测试时,超类方法的构造函数中出现 NullPointerException
Posted
技术标签:
【中文标题】使用 mockito 进行测试时,超类方法的构造函数中出现 NullPointerException【英文标题】:NullPointerException in super class method's constructor when testing using mockito 【发布时间】:2017-10-06 00:41:44 【问题描述】:我有一个超类:
public class A extends Fragment
public A(Context context)
super(context);
B 类继承它:
public class B extends A
public B(Context context)
super(context);
在我使用 Robolectric 和 Mockito 的测试类中,当我像这样实例化 B 类时:B b = new B(context)
我在类 A 的构造函数的超级方法中得到一个空指针异常。我做错了吗?
这是测试代码:
@Mock Context context;
@Before
public void setup()
initMocks(this);
B b = new B(context);
【问题讨论】:
将构建变体中的测试工件更改为单元测试..然后运行它 我不确定我是否完全理解。如何将构建变体设置为单元测试? 我提供的示例还不足以理解问题。如果您希望我添加一些具体的内容,我会很乐意添加。 @GhostCat 我已经添加了 【参考方案1】:简单的答案:没那么容易。
您向我们隐藏的异常堆栈跟踪会告诉您/我们这些 NPE 发生在某些 base android 代码中。事情是:您将 context 对象传递给 Fragment 构造函数。
猜猜看:片段代码然后开始使用该上下文对象。它对该对象进行一系列调用,以检索其他对象,然后对这些对象进行调用。
现在,您只模拟了一个 Context 对象。默认情况下,任何应该返回值的调用都将返回 null。 Mockito 对您正在模拟的课程一无所知。因此,当您希望某个调用返回 null 以外的其他内容时,您必须指定该行为。
因此,“简短”的答案是:您必须准备模拟对象才能像这样使用。长答案……已经给出;你需要深入研究它的details!
除此之外;您可以查看另一个处理完全相同问题的question。
【讨论】:
本例中的模拟对象是否应该是超类? 你不能模拟超级类。你模拟对象。这听起来像是你自己负担过重。事情是:模拟 Android 的东西与做“普通”的 java 单元测试一个模拟完全“不同”。因此:请阅读我提供的链接。读到你明白为止! 嗯,好吧。在这种情况下,您希望我模拟哪个对象?它不可能是被测试的类,我已经在模拟上下文了。 我增强了我的答案并添加了另一个指向类似问题的链接。也许我在那里的其他答案会有所帮助。关键是:您必须检查异常堆栈跟踪,然后您必须模拟该上下文对象上的所有请求,这些请求将在执行 super(context) 时传入。但我很确定有现有的框架可以为你做到这一点。你不想在这里重新发明***。以上是关于使用 mockito 进行测试时,超类方法的构造函数中出现 NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章