黄瓜:为什么我不能传递Java枚举值?

问题描述 投票:1回答:2

给出以下代码:

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.fasterxml.jackson.databind.exc.InvalidFormatException:无法构造的实例字符串中的com.rest.testhandlers.restassured.system.users.enums.Roles值'system-admin':值不是声明的Enum实例名称之一:[ADMIN,OPERATOR,SYSTEM_ADMIN,SYSTEM_VIEWER,​​TENANT_ADMIN,TENANT_OPERATOR,TENANT_VIEWER]

以及当我尝试时:

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

我得到:

cucumber.deps.com.thoughtworks.xstream.converters.ConversionException:无法将system-admin转换为com.rest.testhandlers.restassured.system.users.enums.Roles。法律值是[ADMIN,OPERATOR,SYSTEM_ADMIN,SYSTEM_VIEWER,TENANT_ADMIN,TENANT_OPERATOR,TENANT_VIEWER]

为什么?

谢谢!

cucumber cucumber-java
2个回答
1
投票

我的猜测是,有人尝试将字符串从字符串转换为emum,这导致了第一个问题?在第一次尝试中,您要在Gherkin数据表中传递正确的大写ENUM值,但是在tenantMapping构造函数中,您要贴花传递一个Roles ENUM(包含所有值等),但实际上是从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();
    }

0
投票

我得到:

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]

为什么?

虽然您确实使用小写名称ADMIN("admin")创建枚举,但Jackson和XStream都不知道您要使用此值。因此,它们都只查看大写的枚举的名称。

您可以通过查看XStream和/或Jackson的文档并添加正确的注释来解决此问题。

Btw,您的Cucumber版本旧了。您可能要升级。

© www.soinside.com 2019 - 2024. All rights reserved.