Огурец: Почему я не могу передать Java перечисление? - PullRequest
2 голосов
/ 08 марта 2020

С учетом следующего кода:

public enum Roles {
    ADMIN("admin"),
    OPERATOR("operator"),
    SYSTEM_ADMIN("system-admin"),
    SYSTEM_VIEWER("system-viewer"),
    TENANT_ADMIN("admin"),
    TENANT_OPERATOR("operator"),
    TENANT_VIEWER("viewer");

    private String role;
    private Roles(String role) { this.role = role; }
    public String getRole() {
        return role;
    }
}

public class TenantMapping {

    private String tenant;
    private Roles role;

    public TenantMapping(String tenant, Roles role) {
        super();
        this.tenant = tenant;
        this.role = role;
    }

    //accessors
}

Scenario: Create new users
  When REST Create new user "system_systemuser" with tenants list
    | system | SYSTEM_ADMIN |

@When("^REST Create new user \"(.*)\" with tenants list$")
public void createNewUser(String newUsername, Map<String, Roles> tenantsMap) {
    try {
        List<TenantMapping> tenantMappingsList = new ArrayList<>();
        tenantsMap.forEach((key, value) -> tenantMappingsList.add(new TenantMapping(key, value)));
        ....
}

usersRest. json возможно соответствующий фрагмент:

 "tenant_mappings": [
   {
      "tenant": "system",
      "role": "system-admin"
   }
   ...
 ]

Когда я запускаю сценарий, я получаю:

java .lang.AssertionError: 13:09:43: не удалось получить объект от usersRest. json файл com.faster xml .jackson.databind.ex c .InvalidFormatException: невозможно создать экземпляр of com.rest.testhandlers.restassured.system.users.enums.Roles from String Значение 'system-admin': значение не одно из объявленных имен экземпляров Enum: [ADMIN, OPERATOR, SYSTEM_ADMIN, SYSTEM_VIEWER, TENANT_ADMIN, TENANT_OPERATOR, TENANT_VIEWER *] 1010 *

и когда я пытаюсь:

  Scenario: Create new users
    When REST Create new user "system_systemuser" with tenants list
      | system | system-admin |

, я получаю:

cucumber.deps.com.thoughtworks.xstream.converters.ConversionException: Couldn ' Преобразовать системного администратора в com.rest.testhandlers.restassured.system.users.enums.Roles. Допустимые значения: [ADMIN, OPERATOR, SYSTEM_ADMIN, SYSTEM_VIEWER, TENANT_ADMIN, TENANT_OPERATOR, TENANT_VIEWER]

Почему?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 08 марта 2020

Я предполагаю, что здесь есть какая-то попытка приведения из строки в emum, которая вызывает первую проблему? В первой попытке вы передаете правильное заглавное значение ENUM в свой объект данных Gherkin, но в конструкторе tenantMapping вы заявляете, что передаете объект Roles ENUM (содержащий все значения et c.) И фактически передаете String из dataTable. со значением 'SYSTEM_ADMIN':

public TenantMapping(String tenant, **Roles role**) {
        super();
        this.tenant = tenant;
        this.role = role;
    }

Возможно, вам следует вместо этого вызвать конструктор ENUM в этой функции, используя значение роли (в верхнем регистре), а затем запросить перечисление для его текущей роли (в нижнем регистре) и сохранить ее в своем отображение:

public TenantMapping(String tenant, **String role**) {
        super();
        this.tenant = tenant;
        // better to use some case switch to cover all options in your solution
        if (role.equals("SYSTEM_ADMIN"){Roles.SYSTEM_ADMIN;}
        // the Roles Enum calls its private constructor and sets current 'role' value
        this.role = Roles.getRole();
    }
1 голос
/ 08 марта 2020

Я получаю:

cucumber.deps.com.thoughtworks.xstream.converters.ConversionException: Couldn't convert system-admin to com.rest.testhandlers.restassured.system.users.enums.Roles. Legal values are [ADMIN, OPERATOR, SYSTEM_ADMIN, SYSTEM_VIEWER, TENANT_ADMIN, TENANT_OPERATOR, TENANT_VIEWER]

Почему?

Пока вы создаете свой enum, используя имя в нижнем регистре ADMIN("admin"), ни Джексон, ни XStream не знают, что Вы хотите использовать это значение. Таким образом, они оба смотрят только на имя перечисления в верхнем регистре.

Вы можете обойти это, просмотрев документацию для XStream и / или Джексона и добавив правильные аннотации.

Кстати У тебя версия огурца старая. Возможно, вы захотите обновить.

...