JUnit - 找不到@Before 内的变量
JUnit - Variables inside @Before not found
我正在尝试执行以下代码。我的 IDE 告诉我
USER_ROLE_EMPLOYEE cannot be resolved to a variable
这是我的代码:
public class TestUserHelper {
@Before
public void setUp() throws Exception {
String USER_ROLE_EMPLOYEE="Service Desk";
String USER_ROLE_MANAGER="Store Manager";
}
@Test
public void testIsUserRoleValidEmployee() {
Assert.assertTrue(UserValidator.validateSupervisor(USER_ROLE_EMPLOYEE));
}
@Test
public void testIsUserRoleValidSupervisor() {
Assert.assertTrue(UserValidator.validateSupervisor(USER_ROLE_MANAGER));
}
}
我收到一条错误消息说 USER_ROLE_EMPLOYEE
,USER_ROLE_MANAGER
无法解析为变量。
我做错了什么?
之前是一个设置方法,目前变量仅在方法范围内是局部的,将其作为常量移至class,如@JB Nizet所述
private final static String USER_ROLE_EMPLOYEE="Service Desk";
Java有不同类型的变量:
- 有局部变量。这些是在方法内部声明的,只能从同一方法内访问。我们说这些变量具有 本地作用域 。您的
USER_ROLE_EMPLOYEE
和 USER_ROLE_MANAGER
变量是局部变量。因此,不可能从声明它们的方法以外的方法访问它们。
- 有个实例变量。它们分别存在于 class 的每个实例中,并且可以从 class 中的任何 非静态 方法访问。与局部变量相反,它们也可以从您的外部访问 class;然而,class 的实例始终是必需的。您可以像局部变量一样声明它们,除了您将声明 放在任何方法的 之外(直接在您的 class 中)。他们应该在顶部。您应该为它们添加一个 访问修饰符 (例如
private
),阅读更多关于 here. 的内容
- 然后还有class个变量(
static
个变量)。与实例变量不同,它们只存在一次,并且可以从 class(甚至 static
个)中的任何方法访问。在与实例变量相同的位置声明 class 变量,但使用 static
关键字。与实例变量一样,这些可以从 class 外部访问,具体取决于您声明的访问修饰符。与实例变量不同,它们不需要 class. 的实例
因此,在您的代码中您可以:
使用实例变量代替局部变量:
public class TestUserHelper {
private String USER_ROLE_EMPLOYEE, USER_ROLE_MANAGER;
@Before
public void setUp() throws Exception {
USER_ROLE_EMPLOYEE = "Service Desk";
USER_ROLE_MANAGER = "Store Manager";
}
@Test
public void testIsUserRoleValidEmployee() {
Assert.assertTrue(UserValidator.validateSupervisor(USER_ROLE_EMPLOYEE));
}
@Test
public void testIsUserRoleValidSupervisor() {
Assert.assertTrue(UserValidator.validateSupervisor(USER_ROLE_MANAGER));
}
}
或者,我会推荐第二种方法,因为您的变量实际上是 常量:将它们声明为 static
(class 变量)和 final
(常量)。您将无法再在 setUp()
中初始化它们,但鉴于它们是常量,这不是问题:
public class TestUserHelper {
private static final String USER_ROLE_EMPLOYEE = "Service Desk";
private static final String USER_ROLE_MANAGER = "Store Manager";
@Test
public void testIsUserRoleValidEmployee() {
Assert.assertTrue(UserValidator.validateSupervisor(USER_ROLE_EMPLOYEE));
}
@Test
public void testIsUserRoleValidSupervisor() {
Assert.assertTrue(UserValidator.validateSupervisor(USER_ROLE_MANAGER));
}
}
@O.OBalance的回答很好,我想补充一点,局部变量可以做得更局部!
他简要介绍了作用域,我想补充一个更广泛的作用域定义:花括号 ({}
) 之间的任何代码片段都是 作用域。局部变量在范围内是局部的。这意味着您可以让变量仅可用于方法的一部分。
一个常见的例子是循环:
public int test(){
int a = 1;
while(a < 10){
int b = 2;
a += b;
}
if (b = null) {
System.out.println("See ?");
}
{
str b = "this is a scope";
}
if (b = null) {
System.out.println("And see this too ?");
}
return a;
}
我正在尝试执行以下代码。我的 IDE 告诉我
USER_ROLE_EMPLOYEE cannot be resolved to a variable
这是我的代码:
public class TestUserHelper {
@Before
public void setUp() throws Exception {
String USER_ROLE_EMPLOYEE="Service Desk";
String USER_ROLE_MANAGER="Store Manager";
}
@Test
public void testIsUserRoleValidEmployee() {
Assert.assertTrue(UserValidator.validateSupervisor(USER_ROLE_EMPLOYEE));
}
@Test
public void testIsUserRoleValidSupervisor() {
Assert.assertTrue(UserValidator.validateSupervisor(USER_ROLE_MANAGER));
}
}
我收到一条错误消息说 USER_ROLE_EMPLOYEE
,USER_ROLE_MANAGER
无法解析为变量。
我做错了什么?
之前是一个设置方法,目前变量仅在方法范围内是局部的,将其作为常量移至class,如@JB Nizet所述
private final static String USER_ROLE_EMPLOYEE="Service Desk";
Java有不同类型的变量:
- 有局部变量。这些是在方法内部声明的,只能从同一方法内访问。我们说这些变量具有 本地作用域 。您的
USER_ROLE_EMPLOYEE
和USER_ROLE_MANAGER
变量是局部变量。因此,不可能从声明它们的方法以外的方法访问它们。 - 有个实例变量。它们分别存在于 class 的每个实例中,并且可以从 class 中的任何 非静态 方法访问。与局部变量相反,它们也可以从您的外部访问 class;然而,class 的实例始终是必需的。您可以像局部变量一样声明它们,除了您将声明 放在任何方法的 之外(直接在您的 class 中)。他们应该在顶部。您应该为它们添加一个 访问修饰符 (例如
private
),阅读更多关于 here. 的内容
- 然后还有class个变量(
static
个变量)。与实例变量不同,它们只存在一次,并且可以从 class(甚至static
个)中的任何方法访问。在与实例变量相同的位置声明 class 变量,但使用static
关键字。与实例变量一样,这些可以从 class 外部访问,具体取决于您声明的访问修饰符。与实例变量不同,它们不需要 class. 的实例
因此,在您的代码中您可以:
使用实例变量代替局部变量:
public class TestUserHelper { private String USER_ROLE_EMPLOYEE, USER_ROLE_MANAGER; @Before public void setUp() throws Exception { USER_ROLE_EMPLOYEE = "Service Desk"; USER_ROLE_MANAGER = "Store Manager"; } @Test public void testIsUserRoleValidEmployee() { Assert.assertTrue(UserValidator.validateSupervisor(USER_ROLE_EMPLOYEE)); } @Test public void testIsUserRoleValidSupervisor() { Assert.assertTrue(UserValidator.validateSupervisor(USER_ROLE_MANAGER)); } }
或者,我会推荐第二种方法,因为您的变量实际上是 常量:将它们声明为
static
(class 变量)和final
(常量)。您将无法再在setUp()
中初始化它们,但鉴于它们是常量,这不是问题:public class TestUserHelper { private static final String USER_ROLE_EMPLOYEE = "Service Desk"; private static final String USER_ROLE_MANAGER = "Store Manager"; @Test public void testIsUserRoleValidEmployee() { Assert.assertTrue(UserValidator.validateSupervisor(USER_ROLE_EMPLOYEE)); } @Test public void testIsUserRoleValidSupervisor() { Assert.assertTrue(UserValidator.validateSupervisor(USER_ROLE_MANAGER)); } }
@O.OBalance的回答很好,我想补充一点,局部变量可以做得更局部!
他简要介绍了作用域,我想补充一个更广泛的作用域定义:花括号 ({}
) 之间的任何代码片段都是 作用域。局部变量在范围内是局部的。这意味着您可以让变量仅可用于方法的一部分。
一个常见的例子是循环:
public int test(){
int a = 1;
while(a < 10){
int b = 2;
a += b;
}
if (b = null) {
System.out.println("See ?");
}
{
str b = "this is a scope";
}
if (b = null) {
System.out.println("And see this too ?");
}
return a;
}