当前位置: 首页 > 知识库问答 >
问题:

单元测试静态方法--GsonSerializer

柴良哲
2023-03-14

我需要junit测试一段代码,但它从不同类调用的GsonConverter是静态方法,我无法更改。我不知道如何进行,因为我不能嘲笑它,因为它是静态的。

public String fetchEntity(Object retValue, Object[] args) {

        String refDet= null;
        List<Details> updatedDetails = null;
        if (retValue != null && retValue instanceof List && ((List) retValue).stream()
                .noneMatch((o -> !(o instanceof Details)))) {
            updatedDetails = (List<Details>) retValue;  
        } else {
            logger.warn("Error");
            return null;    
        }
        try {
            refDet= GsonConverter.serialize(updatedDetails );
        } catch (Exception e) {
            logger.warn("Error updatedDetails ");   
        } 
        return refDet;
    }

下面是带有静态方法的类

class GsonConverter{
public static final Gson GSON = new GsonBuilder()
 .registerTypeAdapter(DateTime.class, (JsonDeserializer<DateTime>) (dateTime, type, context) -> ISODateTimeFormat.dateTime().parseDateTime(dateTime.getAsString()))
            .create();

    public static String serialize(Object o) {
        return GSON.toJson(o);
    }
}

共有1个答案

松桐
2023-03-14

最简单的方法是在对象实例后面隐藏GsonConverter的直接使用。也许类似于:

interface JsonMapper {
  String toJsonString(Object o);
}

class GsonJsonMapper implements JsonMapper {
  String toJsonString(Object o) {
    return GsonConverter.serialize(o);
  }
}

现在,在您的原始代码中,依赖于接口(JsonMapper),但将其实例化为GsonJsonMapper(理想情况下使用依赖注入框架,如Guice或Spring)。

// declare an instance of type JsonMapper
private JsonMapper mapper;

public String fetchEntity(Object retValue, Object[] args) {
  // skip the first part ...
  try {
    // use the mapper
    refDet = mapper.serialize(updatedDetails );
  } catch (Exception e) {
    logger.warn("Error updatedDetails ");   
  } 
  return refDet;
}

现在您可以模拟JsonMapper接口了。

 类似资料:
  • 问题内容: 阅读并学习单元测试,尝试理解下面的文章,该文章解释了静态函数调用的困难。 我不清楚这个问题。我一直认为静态函数是在类中舍入实用函数的一种好方法。例如,我经常使用静态函数调用进行初始化,即: //阅读这篇文章后,我现在的目标是… 但是,我为此课程编写的几十个测试是相同的。我什么都没改变,他们仍然都过去了。难道我做错了什么? 该帖子的作者指出: 静态方法的基本问题是它们是过程代码。 我不知

  • 我正在为我的一个应用程序编写单元测试,作为一个很好的实践,我试图使我的类中的所有方法尽可能私有,所以我最终可能会使用大部分私有方法的类,很少使用公共方法,有时还会调用一些静态方法(我的其他类或一些文本,等等) 我想知道如何测试我试图只依赖Mockito和JUnit的所有类,因为Robolectric和Powermockito似乎扩展了单元测试中应该做什么的边界。我应该忽略所有私有和静态方法,以及偶

  • 我有一个这样的方法。 > 如果我模拟记录器,是否必须将方法更改为post(字符串json,记录器记录器)?否则,如何使此模拟与该方法交互?

  • 问题内容: 嗨,我真的希望您能为我提供帮助,我感觉我已经把头发拉了好几天了。 我正在尝试为方法A编写单元测试。方法A调用静态方法B。我想模拟静态方法B。 我知道以前已经有人问过这个问题,但是我觉得Android从那时起已经成熟,并且必须有一种方法可以执行如此简单的任务,而无需重写我要测试的方法。 这是一个示例,首先是我要测试的方法: 接下来,我要模拟的静态方法: 在其他语言中,这是如此简单,但我无

  • 嗨,我真的希望你能帮助我,我感觉我的头发已经拔了好几天了。 我正在尝试为一个方法a编写单元测试。方法a调用一个静态方法B。我想模拟静态方法B。 我知道以前有人问过这个问题,但我感觉Android从那以后已经成熟了,肯定有一种方法可以做到这么简单的任务,而不用重新编写我想测试的方法。 在其他语言中这是如此容易,但我就是无法使它在Android中工作。我试过Mockito,但似乎不支持静态方法 此错误

  • 问题内容: 考虑到没有引入不能再次测试的包装器的方法,则不能在单元测试开发环境中使用静态的类/方法/属性? 另一种情况是,在单元测试目标中使用静态成员时,无法模拟静态成员。因此,在测试单元测试目标时,您必须测试静态成员。当静态成员执行计算时,您想隔离它。 问题答案: 测试静态方法与测试任何其他方法没有什么不同。将静态方法作为 依赖关系 在另一个经过测试的模块中会引发问题(如前所述- 您无法使用免费