我有一个带枚举类型的DTO。我想测试DTO领域,但不知道我该怎么做。
Class MyDto {
public enum ExamResult { PASS, FAIL };
private ExamResult result;
...
}
我正在尝试在其他类
中测试结果字段if(myDto.result.equals("PASS")) {
//doSomething
} else {
//doOtherthing
}
但是.equals()总是让我虚假,即使它有正确的价值。所以不确定我该如何测试它。
答案 0 :(得分:4)
比较相等Enums
值时,就好像它们是整数一样。那里 - 您应该使用==
运算符。虽然equals(ExamResult.PASS)
也可以在评论中提到的正常工作(但这并不经常使用)。
if(myDto.result == ExamResult.PASS) {
//Do something
} else {
//Do other thing
}
如果您只能访问String
代表Enum
的{{1}}代码,则可以使用此类代码:(但我不推荐)
if(myDto.result.getName().equals("PASS")) {
//Do something
} else {
//Do other thing
}
更多解释: Enum
值在编译时被赋予唯一的整数值。在Java语言中,Enum值保证在名称和编译时间编号中是唯一的。您可以使用ordinal()
方法获取Enum唯一编号。可以使用values()
方法将Enums的值作为数组表示形式获取。可以使用name()
方法将Enum值的名称作为String表示形式获取。
答案 1 :(得分:2)
您可以测试与==
运算符的相等性。虽然枚举常量是对象,但每个实例只有一个实例。
JLS 8.9: Enum constants: 因为每个枚举常量只有一个实例,所以当比较两个对象引用时,如果知道至少有一个,则允许使用==运算符代替equals方法它们指的是枚举常量。
if ( ExamResult.PASS == myDto.result ) {
// Do something
}
您也可以使用equals()
方法测试是否相等。 (如果变量为null,则使用左侧的常量可以避免NullPointerException。)
if ( ExamResult.PASS.equals( myDto.result )) {
// Do something
}
您还可以与枚举常量的名称进行比较,该常量通过name()
方法访问。
if ( myDto.result.name().equals( "PASS")) {
// Do something
}
最后,您还可以在switch
语句中使用枚举。有两个以上的枚举常量,这可能更简洁。
switch ( myDto.result ) {
case PASS:
// Do something
break;
case FAIL:
default:
// Do something
break;
}
答案 2 :(得分:2)
Java枚举可以声明自己的变量和方法(可以被各个常量覆盖)。
除了@ AndyThomas'中列出的选项。回答,您可以考虑在常量本身内移动与每个常量相关的实际逻辑(考虑策略模式)。
这允许您在需要时在应用程序的其他位置重用该逻辑,而无需使用纯OOP样式的辅助实用程序方法。这是一个非常复杂的例子,说明你可以做什么(只是为了了解可能的事情):
enum ExamResult {
PASS(true) {
// override the default behavior to do something else
@Override public void doSomething() {
super.doSomething();
System.out.println("whatever");
}
},
FAIL(false);
private final boolean success;
ExamResult(boolean success) { this.success = success }
// you can declare this as abstract if there's no default behavior
public void doSomething() {
System.out.println("Success: " + success);
}
}
现在,您的代码变为:
myDto.result.doSomething(); // of course you need to make sure result is not null
如果您有一个持有考试结果的字符串:
ExamResult.valueOf(yourString).soSomething();