2012-06-21 99 views
0

我爲JUnit的測試下面的代碼:這段代碼如何在JAVA中爲JUnit工作?

import static org.junit.Assert.assertEquals; 
import org.junit.Before; 
import org.junit.Test; 
public class JUnitHelloWorld { 
    protected String s; 
    @Before 
    public void setup() { 
     s = "HELLO WORLD"; 
    } 
    @Test 
    public void testHelloWorldSuccess() { 
     s = s.toLowerCase(); 
     assertEquals("hello world", s); 
    } 
    // will fail even if testHelloWorldSuccess is called first 
    @Test 
    public void testHelloWorldFail() { 
     assertEquals("hello world", s); 
    } 
} 

現在,根據意見,爲什麼會在第二種方法失敗,即使第一種方法是先叫什麼名字?是不是第一種將s的值改爲小寫的方法?

回答

4

@Before發生在每次測試之前。這意味着您運行它們的順序無關緊要,因爲它將始終執行設置,然後執行測試。

標籤@BeforeClass會給你你期待的行爲。這在您的任何測試開始之前運行一次。

+0

事實上切換到@BeforeClass將獲得提供行爲,但隨後這將是糟糕的測試實踐:-P –

+0

在這種情況下,它是壞的測試實踐,因爲執行的順序很重要。我包括'@ BeforeClass',這樣OP就可以理解如何從'@ Before'得到他們期待的行爲。 – n00begon

1

JUnit不會按照您的代碼的順序運行每個測試用例(使用@Test的方法)。這就是爲什麼每個測試用例必須相互獨立的原因。

同樣使用@Before標記的設置方法將始終在每個測試方法之前運行。

所以可能(但不一定是)你的代碼的執行順序是:

  1. 設置()
  2. testHelloWorldSuccess()
  3. 設置()
  4. testHelloWorldFail()

但它也可能運行:

  1. 設置()
  2. testHelloWorldFail()
  3. 設置()
  4. testHelloWorldSuccess()
0

JUnit的,測試用例執行的順序不是固定的。可能碰巧你在方法m1之後編寫了一個方法m2,而在執行時,m2首先被執行。最好的方法是您的測試用例不應該基於測試用例執行順序。 嘗試@BeforeClass如果你想要爲整個類只執行一次。

對於上述方案試試這個:

protected String s; 
    private int flag ; 
     @BeforeClass 
     public beforeClass(){ 
      flag = 0; 
     } 
     @Before 
     public void setup() { 
      s = "HELLO WORLD"; 

     } 
     @Test 
     public void testHelloWorldSuccess() { 
     flag = 1; 
      s = s.toLowerCase(); 
      assertEquals("hello world", s); 
     } 
     // won't fail even if testHelloWorldSuccess is called first 
     @Test 
     public void testHelloWorldFail() { 
     if(flag == 1) 
      assertEquals("hello world", s); 
     else 
     assertEquals("HELLO WORLD", s); 
     }