在为需要将对象映射到列表的方法编写测试时面对 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

获取列表的可行性