JUnit-找不到@Before内的变量

时间:2018-06-19 17:57:14

标签: java junit local-variables

我正在尝试执行以下代码。我的IDE告诉我

  

USER_ROLE_EMPLOYEE无法解析为变量

这是我的代码:

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

我在做什么错了?

3 个答案:

答案 0 :(得分:1)

Java具有不同类型的变量:

  • 局部变量。它们在方法内部声明,并且只能从同一方法内部访问。我们说这些变量具有本地范围。您的USER_ROLE_EMPLOYEEUSER_ROLE_MANAGER变量是局部变量。因此,不可能通过不同于声明它们的方法来访问它们。
  • 个实例变量。这些分别存在于您的类的每个实例中,并且可以从类中的任何非静态方法进行访问。与局部变量相反,它们也可以从您的班级外部进行访问。但是,始终需要类的实例。除了将声明的 outside 放在任何方法(直接在您的类中)之外,您就像声明局部变量一样声明它们。他们应该在顶部。您应该向他们添加访问修饰符(例如private),并详细了解该here
  • 然后是类变量static变量)。与实例变量不同,它们仅存在一次,并且可以从类中的任何方法(甚至是static的方法)中访问。在与实例变量相同的位置声明类变量,但使用static关键字。与实例变量一样,根据声明的访问修饰符,可以从类外部访问这些变量。与实例变量不同,它们不需要类的实例。

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

  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(类变量)和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));
        }
    }
    

答案 1 :(得分:0)

之前是设置方法方法,当前变量仅在方法范围内是局部变量,将其作为常量移动到类中,如@JB Nizet所述

    private final static String USER_ROLE_EMPLOYEE="Service Desk";

答案 2 :(得分:0)

@ O.OBalance的答案非常好,我想补充一点,就是可以使局部变量变得更加局部!

他简要介绍了作用域,我还要补充一点,范围的定义更加广泛:花括号({})之间的任何代码段都是 scope 。并且局部变量对于范围是局部的。这意味着您只能将变量仅用于方法的一部分。

一个常见的例子是循环:

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;
}