如何在对子类进行单元测试时在抽象类中注入变量?

2024-01-04

我有一个抽象类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(使用前将#替换为@)

如何在对子类进行单元测试时在抽象类中注入变量? 的相关文章

随机推荐