Преобразовать строку в список>> для испытаний - PullRequest
0 голосов
/ 25 октября 2019

Мне нужно преобразовать String в List<Map<String, String>>> для прохождения теста JUnit. У меня есть это:

String userAttributes = "[{name=test, cp=458999, lastname=test2}]";

Что я хочу, это в тестах (Mockito) изменить вызов на сервер с этими значениями, что-то вроде этого:

Mockito.when(template.search(Mockito.anyString, new AttributesMapper()).thenReturn(attributes);

Мне нужно List<Map<String, String>>> для этого:

user.setUserName(attributes.get("name"));

Ответы [ 2 ]

0 голосов
/ 25 октября 2019
    String userAttributes = "[{name=test, cp=458999, lastname=test2}]";
    StringTokenizer stringTokenizer = new StringTokenizer(userAttributes,",");
    List<Map<String,String>> list = new ArrayList<>();
    while(stringTokenizer.hasMoreElements()){
        StringTokenizer stringTokenizer2 = new StringTokenizer((String)stringTokenizer.nextElement(),"=");
        while(stringTokenizer2.hasMoreElements()){
            Map<String, String> map = new HashMap<>();
            map.put( ((String)stringTokenizer2.nextElement()),((String)stringTokenizer2.nextElement()) );
            list.add(map);
        }
    }

    System.err.println(list.toString());
0 голосов
/ 25 октября 2019

Попробуйте регулярное выражение или разделите по специальному символу

String userAttributes = "[{name=test, cp=458999, lastname=test2}]";

List<String> strings = Arrays.asList(userAttributes
      .replace("[{","")
      .replace("}]","").split(", "));
Map<String, String> collect = strings.stream()
      .map(s -> s.split("="))
      .collect(Collectors.toMap(s -> s[0], s -> s[1]));

System.out.println(collect.get("name"));

Или, если вы действительно хотите List<Map<String, String>>>, но вы не можете сделать, чем user.setUserName(attributes.get("name"));

List<Map<String, String>> maps = strings.stream()
      .map(s -> s.split("="))
      .map(s -> Map.of(s[0], s[1]))
      .collect(Collectors.toList());

System.out.println(maps);
...