【问题标题】:Cucumber: Why do I fail to pass Java enum value?Cucumber:为什么我无法传递 Java 枚举值?
【发布时间】:2020-06-20 12:57:28
【问题描述】:

给定以下代码:

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,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: 无法将系统管理员转换为 com.rest.testhandlers.restassured.system.users.enums.Roles。合法的 值为 [ADMIN, OPERATOR, SYSTEM_ADMIN, SYSTEM_VIEWER, TENANT_ADMIN、TENANT_OPERATOR、TENANT_VIEWER]

为什么?

【问题讨论】:

    标签: cucumber cucumber-java


    【解决方案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();
        }
    

    【讨论】:

      【解决方案2】:

      我明白了:

      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 的文档并添加正确的注释来解决此问题。

      顺便说一句,你的 Cucumber 版本太旧了。您可能需要升级。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多