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

标签 java unit-testing jmockit expectations

当然,我已经有一段时间没有使用 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() 预计返回一个列表。如您所见,我设置返回列表,但代码中的模拟 get() 仅返回包含的字符串,这会导致转换异常。

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

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

最佳答案

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

关于java - JMockit 模拟返回 String 而不是提供的 List<String>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33179247/

相关文章:

python - 您在 App Engine 上使用什么方法进行轻量级 Python 单元测试?

JMOCKIT:com.sun.tools.attach.AgentLoadException:找不到代理 JAR 或没有代理类属性

java - 调用了构造函数中的验证方法

java - 如何删除 Hibernate 弃用警告消息

unit-testing - 忽略testng中的一个类

java - 我可以使用 wait 而不是 sleep 吗?

java - 如何模拟具有两种不同实现的接口(interface)

java - JMockit模拟目标类的方法

java - HashMap 键/值引用

java - 使用 <phase> 在 Maven 中串行执行插件