Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Robot Framework: Как правильно передать dictionary в java метод с сохранением типов значений?

robot-framework
java
Теги: #<Tag:0x00007f7b650d0998> #<Tag:0x00007f7b650d0740>

(Seploid) #1

Всем привет!
У меня есть java method-keyword на вход которого я передаю словарь из robot-файла.
словарь выглядит так
${limit1}= create dictionary limitType=LOSSMONTHLYLIMIT limitValue=50 accepted=true

структура метода следующая
public String getJsonFromDictionary(Map<String, Object> object) {...}

Я ожидаю, что каждое значение в Map’е будет соответствующего типа, так limitType - это String, limitValue - Integer, а accepted - Boolean
Но почему-то все значения приводятся к типу String

Подскажите есть ли решение этой проблемы или же придется конвертировать каждое значение?


(Seploid) #2

Ничего подходящего не нагуглил, кроме документации о Dictionary:
If a dictionary variable is used in a cell with other data (constant strings or other variables), the final value will contain a string representation of the variable value. The end result is thus exactly the same as when using the variable as a scalar with other data in the same cell.

Исходя из этого создал утилитарный класс со следующими методами

public static Map<String,Object> getTypedDictionary(Map<String, String> dictionaryMap) {

        if (dictionaryMap == null) {
            return null;
        }
        Map<String, Object> map = new HashMap<>();
        for (Map.Entry<String, String> entry: dictionaryMap.entrySet() ) {
            Object value = getTypedValue(entry.getValue());
            if(!"OMITTED".equals(value)) {
                map.put(entry.getKey(), value);
            }
        }
        return map;
    }

    @SuppressWarnings(value = "unchecked")
    public static List getTypedList(List objects) {
        List<Object> list = new ArrayList();
        for (Object object: objects) {
            list.add(getTypedValue(object));
        }
        return list;
    }

    @SuppressWarnings(value = "unchecked")
    private static Object getTypedValue(Object object) {
        if (object instanceof PyList) {
            return getTypedList((List) object);
        }
        if (object instanceof PyDictionaryDerived) {
            return getTypedDictionary((Map<String, String>) object);
        }
        String stringValue = (String) object;
        //converting to different types
        //Integer
        try {
            return Integer.valueOf(stringValue);
        } catch (Exception ignore){}
        //Double
        try {
            return Double.valueOf(stringValue);
        } catch (Exception ignore){}
        //Boolean
        if (stringValue.equalsIgnoreCase("true") || stringValue.equalsIgnoreCase("false")) {
            return Boolean.valueOf(stringValue);
        }
        //null
        if (stringValue.equalsIgnoreCase("null")) {
            return null;
        }
        //String
        if (stringValue.startsWith("\"") && stringValue.endsWith("\"")) {
            return stringValue.substring(1,stringValue.length()-1);
        }
        //String by default
        return stringValue;
    }

Работает нормально, пока нареканий нет, выглядит как какой-то велосипед :slight_smile:


(rmerkushin) #3

Воу-воу, палехче :smile: Просто оберните то что должно быть числом в ${}
Тобишь в вашем случае это:

${limit1}= create dictionary limitType=LOSSMONTHLYLIMIT limitValue=${50} accepted=true

P.S.: С null и boolean такая же история. подробнее тут: http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#number-variables