2017-02-16 30 views
0

我有一个有静态和非静态字段的类。我将这个类参数化为JUnit测试。 现在我怀疑静态字段是否在测试之间共享。如果@Parameterized注解只能帮助创建同一类的许多实例,那么我相信静态字段在测试之间共享,但如果它创建不同的类(例如,在后台为类名添加一些后缀),那么每个类都会有它自己的静态字段。 我试着用这个代码来测试它,但没有成功:当类被参数化时,在测试之间共享类的静态字段?

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.junit.runners.Parameterized; 

import java.util.Arrays; 
import java.util.List; 

@RunWith(Parameterized.class) 
public class Parametrized { 
    public static String field1; 
    public String field2; 
    public int slp; 

    public Parametrized (String str1, String str2, int slp) { 
    this.field1 = str1; 
    this.field2 = str2; 
    this.slp = slp; 
    } 

    @Parameterized.Parameters() 
    public static List<Object[]> data() { 
    return Arrays.asList(new Object[][] {{"1_static", "1_nonstatic", 5000}, {"2_static", "2_nonstatic", 2000}}); 
    } 

    @Test 
    public void test_static() throws InterruptedException { 
    System.out.println(field1); 
    Thread.sleep(this.slp); 
    System.out.println(field2); 
    System.out.println(field1); 
    } 
} 

首先,我注意到,测试不平行运行,但接二连三:我认为这是使用@Parameterized的要点 - 并行运行测试。

其次,因为它是一个接一个地运行它并没有帮助我找出静态字段是否共享。

+0

如果使用Maven的SureFire插件运行测试,它的工作原理也不清楚 - 它是否会在后台创建参数化类的不同副本,每个副本都有自己的静态对象? – user6419217

回答

2

添加注释不会改变Java的工作方式。一个static字段仍然是一个静态字段。

这不是用于并行运行测试,因为它们可能会相互干扰。例如一个像静态字段的共享资源。

顺便说一句,如果你在构造函数中设置一个静态字段,你几乎肯定会做错某些事情。

+0

关于在构造函数中设置静态字段 - 我是故意测试静态字段是否共享。这就是为什么我在那里添加睡眠的原因:我想用第一组数据设置它,然后用第二组数据改变它,然后从第一组数据中检查它的值,看它是否被第二组数据数据。但是,因为它不是并行运行,而是按顺序运行 - 这没有多大意义。这就是我来这里澄清事情的原因。 – user6419217

+0

@ user6419217静态字段仍然是静态的。你只能用它来测试跨越测试的字段,所以没关系。测试之间的干扰是真正的调试难题。 –