在为需要将对象映射到列表的方法编写测试时面对 java.lang.ClassCastException
Facing java.lang.ClassCastException while writing tests for a method that requires to map Object to List
我正在使用 Mockito 为以下 Class 编写单元测试:
public class ExternalQueryBuilder {
public String buildQuery(Map<String, Object> request) {
StringBuilder queryBuilder = new StringBuilder();
if (request.containsKey("dataElement") && request.get("dataElement") != null) {
queryBuilder.append("&Data Element=").append(request.get("dataElement"));
}
log.info(String.valueOf(request.get("dataSourceType")));
if (request.containsKey("dataSourceType")) {
List<String> dataSourceType = (List<String>) request.get("dataSourceType");
if(dataSourceType.size() > 0)
queryBuilder.append("&Data Source Type=").append(dataSourceType.get(0).replace("&", "\&"));
}
}
}
正如您在该方法中所见,if (request.containsKey("dataSourceType"))
中有一行是 List<String> dataSourceType = (List<String>) request.get("dataSourceType");
对来自 request.get("dataSourceType");
的任何数据进行转换。在这一行中,我收到此错误 java.lang.ClassCastException: class java.lang.Object cannot be cast to class java.util.List (java.lang.Object and java.util.List are in module java.base of loader 'bootstrap')
现在我的测试代码是:
public void buildQueryTest(){
StringBuilder queryBuilder = Mockito.mock(StringBuilder.class);
Object obj = Mockito.mock(Object.class);
Map<String, Object> request = new HashMap<>();
request.put("dataElement",obj);
request.put("dataSourceType",obj);
externalQueryBuilder.buildQuery(request);
}
在这段代码中,我使用类型 Map<String, Object>
初始化 request
因为在上面的 Class 方法中,我测试 request
的类型是 Map<String, Object>
而已。
然后最后我调用实际方法 externalQueryBuilder.buildQuery(request);
其中 externalQueryBuilder 是 class 的对象我是 mocking.This 行将调用实际方法,当我到达第 List<String> dataSourceType = (List<String>) request.get("dataSourceType");
行在实际方法中抛出 Classcast 错误。
我需要一些帮助。请提供一些解决问题的建议 it.I 是 Java 和 Mockito 的新手。
您不能像
那样将对象分配给列表
List<String> dataSourceType = (List<String>) request.get("dataSourceType");
将其分配给具有列表的对象
Object obj = request.get("dataSourceType");
对象 obj 可以是带有列表 属性 的自定义对象,可以通过 obj.getListProperty 获得
检查从 obj
获取列表的可行性
我正在使用 Mockito 为以下 Class 编写单元测试:
public class ExternalQueryBuilder {
public String buildQuery(Map<String, Object> request) {
StringBuilder queryBuilder = new StringBuilder();
if (request.containsKey("dataElement") && request.get("dataElement") != null) {
queryBuilder.append("&Data Element=").append(request.get("dataElement"));
}
log.info(String.valueOf(request.get("dataSourceType")));
if (request.containsKey("dataSourceType")) {
List<String> dataSourceType = (List<String>) request.get("dataSourceType");
if(dataSourceType.size() > 0)
queryBuilder.append("&Data Source Type=").append(dataSourceType.get(0).replace("&", "\&"));
}
}
}
正如您在该方法中所见,if (request.containsKey("dataSourceType"))
中有一行是 List<String> dataSourceType = (List<String>) request.get("dataSourceType");
对来自 request.get("dataSourceType");
的任何数据进行转换。在这一行中,我收到此错误 java.lang.ClassCastException: class java.lang.Object cannot be cast to class java.util.List (java.lang.Object and java.util.List are in module java.base of loader 'bootstrap')
现在我的测试代码是:
public void buildQueryTest(){
StringBuilder queryBuilder = Mockito.mock(StringBuilder.class);
Object obj = Mockito.mock(Object.class);
Map<String, Object> request = new HashMap<>();
request.put("dataElement",obj);
request.put("dataSourceType",obj);
externalQueryBuilder.buildQuery(request);
}
在这段代码中,我使用类型 Map<String, Object>
初始化 request
因为在上面的 Class 方法中,我测试 request
的类型是 Map<String, Object>
而已。
然后最后我调用实际方法 externalQueryBuilder.buildQuery(request);
其中 externalQueryBuilder 是 class 的对象我是 mocking.This 行将调用实际方法,当我到达第 List<String> dataSourceType = (List<String>) request.get("dataSourceType");
行在实际方法中抛出 Classcast 错误。
我需要一些帮助。请提供一些解决问题的建议 it.I 是 Java 和 Mockito 的新手。
您不能像
那样将对象分配给列表List<String> dataSourceType = (List<String>) request.get("dataSourceType");
将其分配给具有列表的对象
Object obj = request.get("dataSourceType");
对象 obj 可以是带有列表 属性 的自定义对象,可以通过 obj.getListProperty 获得 检查从 obj
获取列表的可行性