我有以下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的值更改为小写的方法?
答案 0 :(得分:4)
@Before
在每次测试之前发生。这意味着您运行它们的顺序无关紧要,因为它始终执行设置然后进行测试。
标记@BeforeClass
会为您提供您期望的行为。在任何测试开始之前运行一次。
答案 1 :(得分:1)
JUnit不按代码顺序运行每个测试用例(使用@Test的方法)。这就是为什么每个测试用例必须彼此独立的原因。
使用@Before标记的设置方法也会在每个测试方法之前运行。
因此,代码执行顺序的可能性(但不一定)是:
但它也可能会运行:
答案 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);
}