这段代码如何在JAVA中用于JUnit?

时间:2012-06-21 04:13:29

标签: 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的值更改为小写的方法?

3 个答案:

答案 0 :(得分:4)

@Before在每次测试之前发生。这意味着您运行它们的顺序无关紧要,因为它始终执行设置然后进行测试。

标记@BeforeClass会为您提供您期望的行为。在任何测试开始之前运行一次。

答案 1 :(得分:1)

JUnit不按代码顺序运行每个测试用例(使用@Test的方法)。这就是为什么每个测试用例必须彼此独立的原因。

使用@Before标记的设置方法也会在每个测试方法之前运行。

因此,代码执行顺序的可能性(但不一定)是:

  1. 设置()
  2. testHelloWorldSuccess()
  3. 设置()
  4. testHelloWorldFail()
  5. 但它也可能会运行:

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

答案 2 :(得分: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);
        }