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_EMPLOYEEUSER_ROLE_MANAGER 无法解析为变量。

我做错了什么?

之前是一个设置方法,目前变量仅在方法范围内是局部的,将其作为常量移至class,如@JB Nizet所述

    private final static String USER_ROLE_EMPLOYEE="Service Desk";

Java有不同类型的变量:

  • 局部变量。这些是在方法内部声明的,只能从同一方法内访问。我们说这些变量具有 本地作用域 。您的 USER_ROLE_EMPLOYEEUSER_ROLE_MANAGER 变量是局部变量。因此,不可能从声明它们的方法以外的方法访问它们。
  • 个实例变量。它们分别存在于 class 的每个实例中,并且可以从 class 中的任何 非静态 方法访问。与局部变量相反,它们也可以从您的外部访问 class;然而,class 的实例始终是必需的。您可以像局部变量一样声明它们,除了您将声明 放在任何方法的 之外(直接在您的 class 中)。他们应该在顶部。您应该为它们添加一个 访问修饰符 (例如 private),阅读更多关于 here.
  • 的内容
  • 然后还有class个变量static个变量)。与实例变量不同,它们只存在一次,并且可以从 class(甚至 static 个)中的任何方法访问。在与实例变量相同的位置声明 class 变量,但使用 static 关键字。与实例变量一样,这些可以从 class 外部访问,具体取决于您声明的访问修饰符。与实例变量不同,它们不需要 class.
  • 的实例

因此,在您的代码中您可以:

  1. 使用实例变量代替局部变量:

    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));
        }
    }
    
  2. 或者,我会推荐第二种方法,因为您的变量实际上是 常量:将它们声明为 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;
}