2012-06-21 100 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); 
     }