2017-02-16 61 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靜態字段仍然是靜態的。你只能用它來測試跨越測試的字段,所以沒關係。測試之間的干擾是真正的調試難題。 –