这是我的简单interface
和enum
implements
。我写了一个非常简单的JUnit Test case
,由于NullPointerException
而失败了。我不明白为什么抛出这个Exception
。我在测试类中构造了一个enum
对象。
public interface Account {
public String getName();
public boolean isBillable();
}
public enum NonBillableAccount implements Account {
SICK_LEAVE("SickLeave"),
VACATION("Vacation"),
BUSINESS_DEVELOPMENT("businessDevelopment");
private String leaveType;
private NonBillableAccount(String leavetype) {
this.leaveType = leavetype;
}
@Override
public String getName() {
return this.leaveType;
}
@Override
public boolean isBillable() {
return false;
}
}
此处JUnit test case
public class NonBillableAccountTest {
Account ac = null;
@Before
public void setUp() throws Exception {
Account ac = NonBillableAccount.BUSINESS_DEVELOPMENT;
}
@Test
public void testGetName() {
assertEquals(ac.getName(),"businessDevelopment");
}
@Test
public void testIsBillable() {
assertEquals(ac.isBillable(), false);
}
}
答案 0 :(得分:3)
您没有设置总体课程的ac
字段。您正在使用新的Account ac
变量隐藏它(实际上称为shadowing)。要解决此问题,只需在变量赋值之前删除Account
类型名称。
您也可以使用this.ac
来引用变量,但只要在引用变量之前没有在本地范围内声明具有相同名称的变量,就没有必要。
答案 1 :(得分:3)
通过使用ac
类型修饰符引用Account
,如下所示,您将其视为局部变量:
// Create a local variable "ac", does not affect the class variable
Account ac = NonBillableAccount.BUSINESS_DEVELOPMENT;
if (this.ac == null){
System.println('It does still equal null!'); // yep, it's null
}
尝试使用此选项在测试类上设置ac
属性:
// refers to the class variable implicitly
ac = NonBillableAccount.BUSINESS_DEVELOPMENT;
或强>
// refers to the class variable explicitly
this.ac = NonBillableAccount.BUSINESS_DEVELOPMENT;
这称为“阴影”(explained here),它允许您在不同的上下文中使用相同的变量名称。在您的测试方法中,它会在编译器中将ac
扩展为this.ac
,当您调用ac.getName()
时会抛出NPE,因为您还没有设置类属性。