2017-10-21 98 views
0

我單元測試類像下面靜態成員值被輸送到下一個測試

public class A { 
private static String aStr = null; 

public void doSomething() { 
    if (null == aStr) { 
     // do something to init aStr, and this initialized val gets cached for future calls. 
     aStr = some_val; 
    } else { 
     // do something else using aStr value. 
    } 
} 

查閱而單元測試此我做:

public class ATest { 
private A a; 

@BeforeMethod 
public void setup() { 
    a = new A(); 
} 

    @Test 
    public void test1() { 
    a.doSomething(); 
    // assert on some_val being fetched correctly. 
    } 

    @Test 
    public void test2() { 
    a.doSomething(); 
    // assert again for some_val 

    // this is where some_val fetching is not invoked at all, while debugging I 
    // can see that aStr is already being initialized from previous test. 
    } 
} 

我被假設由於我重新初始化在@BeforeMethod設置中的對象'a',我應該得到所有測試的空值。是不是這個假設是正確的?

+2

爲什麼要通過創建新實例來重新初始化靜態字段? –

+1

我認爲你對'static'關鍵字的含義感到困惑。這意味着一個領域不再屬於一個實例。對於'static',它會得到一個由該類的所有實例共享**的字段。所以並不是說這個類的每個實例都有它自己的'aStr',它們全部共享**相同的''aStr'字段。 – Zabuza

+0

當一個新的對象重置它們的值時,對靜態成員有什麼意義?如果是這樣的話,Java將被邏輯破壞。 – Tom

回答

2

static在java中的字段上的修飾符意味着該字段不屬於該類的特定實例,而是屬於類本身。在大多數情況下,您只有運行JVM中的類的範例。因此,您創建的這個類的多少個對象並不重要 - 它們都將共享一個靜態字段。並且該字段具有同一個值

+1

哦,是的..我錯過了..非常感謝你的澄清。任何關於如何更好地測試它的建議? –

+1

@BlueEagle只要你開始擁有靜態,你就會讓測試變得更加困難。你幾乎不應該這樣做。 –

+0

如果你確實需要靜態字段,那麼在'@ AfterMethod'中將它設置爲'null' – Nikem