我有一个抽象类BaseTemplate
以及扩展它的多个类。在具体类之一(SmsTemplate extends BaseTemplate
),我们有一个私有变量Gson
。我们有相同的私有变量(Gson
)也在抽象类中。
在对具体类进行单元测试时,抽象类中的方法是从具体类中调用的。在我的单元测试中,我使用Whitebox.setInternalState(smsTemplateObj, gsonObj);
将 Gson 对象注入到私有成员中SmsTemplate
and BaseTemplate
但 Gson 只被注入到子类中。在抽象类中,它的NULL
,表示未注入。下面是实现。
有人可以告诉我如何在抽象类中注入 Gson 对象吗?
abstract class BaseTemplate{
private Gson gson;//Here its not getting injected
protected String getContent(Content content){
return gson.toJson(content); // ERROR - gson here throws NPE as its not injected
}
}
class SmsTemplate extends BaseTemplate{
private Gson gson;//Here its getting injected
public String processTemplate(Content content){
String strContent = getContent(content);
...
...
gson.fromJson(strContent, Template.class);
}
}
Whitebox.setInternalState()
方法只会设置它在传递的对象的层次结构中遇到的第一个字段的值。所以一旦发现gson
子类中的字段,它不会进一步查找,也不会更改超类字段。
对于这种情况有两种解决方案:
-
更改变量名称。如果变量有不同的名称,您可以简单地调用
Whitebox.setInternalState()
两次,每个变量一次。
-
使用反射手动设置字段。您也可以使用类似以下代码片段的内容来设置字段,而无需 Mockito 的帮助。
Snippet:
Field field = smsTemplateObj.getClass().getSuperclass().getDeclaredField("gson");
field.setAccesible(true);
field.set(smsTemplateObj, gsonObj);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)