Java 当从多个模块初始化静态变量时,静态变量在Junit中是如何工作的?

Java 当从多个模块初始化静态变量时,静态变量在Junit中是如何工作的?,java,junit,mockito,Java,Junit,Mockito,假设我有一个带有静态变量的类,如下所示: public class var{ public static String myvar = "thor"; } 和junit类,如下所示: public class test1{ @Test public void test(){ var.myvar = "1"; } } public class test2{ @Test public void

假设我有一个带有静态变量的类,如下所示:

public class var{
    public static String myvar = "thor";
}
和junit类,如下所示:

public class test1{
    @Test
    public void test(){
       var.myvar = "1";
    }
}

public class test2{
     @Test
    public void test(){
       var.myvar = "1";
    }
}
当运行两个junit类时,它们是否共享同一个变量?或者junit以某种方式使这些变量成为线程安全的,这样每个模块都有自己的静态变量


更新:如果是前者,如何为整个junit构建设置静态变量?

静态变量与类链接,因此由于只有一个.class实例,因此变量myvar也将是一个,无论您在何处访问它,它将使用相同的变量。

静态变量只创建一次,并在类的所有实例中共享

注意:如果修改静态变量的值,则更改将影响所有实例

现在,来回答你的问题:

Q:运行两个JUnit类时,它们是否共享同一个变量

A:是的,它们将共享相同的变量

例如:

public final class Constants {
  
   public static String myVar = "abc";

}
JUnit类:

@RunWith(MockitoJUnitRunner.class)
public class Test1 {
    
    @Test
    public void test(){
       Constants.myVar = "def";
    }

}

@RunWith(MockitoJUnitRunner.class)
public class Test2 {
    
    @Test
    public void test(){
        System.out.println(Constants.myVar);
    }

}

假设您从
Test1
类调用
test()
方法,则
myVar
的值将更改为
def
,因为它是一个公共变量。当您从
Test2
调用
test()
方法时,它将显示
def
,因为您已经从
Test1
更改了
myVar
的值。Fernando这个解释行吗?在运行al-junit类之前如何设置静态?这个例子对您合适吗?“如何为整个junit构建设置静态变量?“
@BeforeClass
?可变全局状态-如此-倾向于指示设计问题。为什么您需要以这种方式对其进行更改以进行测试?是什么阻止了对非测试的更改?有许多模块依赖于静态变量的初始化。如果变量未初始化,它将抛出空指针异常。这就是现在的问题。有没有一种方法可以初始化junit类整个生命周期的静态变量?那么,在这种情况下,您需要创建用于整个应用程序的公共常量。@Fernando我不是说初始化它有问题,我是说允许(和需要)有问题它的值将在初始化后更改。