JMockit mock returns String 而不是提供的 List<String>
JMockit mock returns String instead of the List<String> provided
当然,我已经有一段时间没有使用JMockit了,但我不记得这种困难。我对一些非常简单的代码进行了非常简单的测试。但是即使我设置了 returns = List,模拟的方法仍然只 returning 一个字符串!这是测试:
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" 是多值地图,而不是地图。所以 params.get() 应该是 return 一个列表。如您所见,我将 return 设置为列表,但代码中的模拟 get() return 仅包含字符串,这会导致转换异常。
我也尝试过使用 returns(...)。我试过在单独的步骤中制作 arSkip 并将其定义为最终版本。没有任何效果。
我怀疑 JMockit 将我的列表解释为顺序响应,但它应该看到类型与方法的 return 类型相匹配。这是怎么回事?
这是从 JMockit 1.11 (Aug/2014) 开始的回归。它将在 1.20 版本中修复 (Oct/2015)。
当然,我已经有一段时间没有使用JMockit了,但我不记得这种困难。我对一些非常简单的代码进行了非常简单的测试。但是即使我设置了 returns = List,模拟的方法仍然只 returning 一个字符串!这是测试:
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" 是多值地图,而不是地图。所以 params.get() 应该是 return 一个列表。如您所见,我将 return 设置为列表,但代码中的模拟 get() return 仅包含字符串,这会导致转换异常。
我也尝试过使用 returns(...)。我试过在单独的步骤中制作 arSkip 并将其定义为最终版本。没有任何效果。
我怀疑 JMockit 将我的列表解释为顺序响应,但它应该看到类型与方法的 return 类型相匹配。这是怎么回事?
这是从 JMockit 1.11 (Aug/2014) 开始的回归。它将在 1.20 版本中修复 (Oct/2015)。