给出以下代码:
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]
为什么?
谢谢!
答案 0 :(得分:2)
我的猜测是,有人在尝试从字符串转换为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();
}
答案 1 :(得分:1)
我得到:
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版本较旧。您可能要升级。