JMockit 模拟返回 String 而不是提供的 List<String>

Posted

技术标签:

【中文标题】JMockit 模拟返回 String 而不是提供的 List<String>【英文标题】:JMockit mock returns String instead of the List<String> provided 【发布时间】:2015-10-16 20:43:41 【问题描述】:

当然,我使用 JMockit 已经有一段时间了,但我不记得有这种困难。我对一些非常简单的代码进行了非常简单的测试。但是即使我设置了returns = List,模拟的方法仍然只返回一个字符串!这是测试:

public class ResponseWrapperTest 
  @Mocked
  UriInfo uri;

  @Mocked  // I've also tried @Injectable
  MultivaluedMap<String,String> queryParams;

  @Test
  public void ResponseWrapper() throws JSONException 
      final List<String> arSkip = new ArrayList<String>(Arrays.asList("0"));        

      new Expectations() 
          uri.getQueryParameters();     result = queryParams;
          queryParams.get("skip");      result = arSkip;    
      ;

      ResponseWrapper wrapper = new ResponseWrapper(uri);

这是它正在测试的代码:

ResponseWrapper(UriInfo uriInfo) 
    MultivaluedMap<String,String> params = uriInfo.getQueryParameters();
    String skip = getParam(params, "skip");


private String getParam(MultivaluedMap<String,String> params, String name) 
    String result = null;
    List<String> list = params.get(name);  // <== Cast exception occurs here
    if (list != null) 
        result = list.get(0);
       
    return result;

请注意,“params”是 MultivaluedMap,而不是 Map。所以 params.get() 应该返回一个列表。如您所见,我将 return 设置为 List,但代码中的模拟 get() 仅返回包含的 String,这会导致强制转换异常。

我也尝试过使用returns(...)。我已经尝试在单独的步骤中制作 arSkip 并将其定义为最终版本。没有任何效果。

我怀疑 JMockit 将我的列表解释为顺序响应,但它应该看到类型与方法的返回类型匹配。这是怎么回事?

【问题讨论】:

【参考方案1】:

这是从 JMockit 1.11(2014 年 8 月)开始的回归。它将在版本 1.20(2015 年 10 月)中修复。

【讨论】:

好吧,我猜这至少不是我的理智。谢谢(你的)信息!有人知道在此期间是否有解决方法吗? 好吧,我想说你不应该首先嘲笑地图。一般来说,模拟“值对象”(包括集合和映射)通常被认为是不好的做法。 好点。为此,我意识到我可以创建一个 MultivaluedMap 的简单实现并避免整个问题。谢谢罗热里奥。

以上是关于JMockit 模拟返回 String 而不是提供的 List<String>的主要内容,如果未能解决你的问题,请参考以下文章

JMockit - 期望和静态方法

JMockit 基础:模拟对象、模拟参数、期望

在Jmockit停止嘲笑

JMockit - 期望 - 匹配包含模拟对象作为参数的方法调用

如何使用Jmockit模拟JdbcTemplate.update?

用jmockit模拟扩展类的抽象方法