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

这段代码在JAVA中如何适用于JUnit?,java,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

我有以下用于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的值改为小写吗?

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


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

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


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

JUnit不会按代码顺序运行每个测试用例(带有@test的方法)。这就是为什么每个测试用例必须相互独立

另外,带有@Before标记的setup方法将始终在每个测试方法之前运行

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

  • 设置()
  • testHelloWorldSuccess()
  • 设置()
  • testHelloWorldFail()
  • 但它也可能运行:

  • 设置()
  • testHelloWorldFail()
  • 设置()
  • testHelloWorldSuccess()

  • JUnit不会按照代码的顺序运行每个测试用例(带有@test的方法)。这就是为什么每个测试用例必须相互独立

    另外,带有@Before标记的setup方法将始终在每个测试方法之前运行

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

  • 设置()
  • testHelloWorldSuccess()
  • 设置()
  • testHelloWorldFail()
  • 但它也可能运行:

  • 设置()
  • testHelloWorldFail()
  • 设置()
  • testHelloWorldSuccess()

  • 对于JUnit,testcase的执行顺序不是固定的。您可能会在方法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);
            }
    

    对于JUnit,testcase的执行顺序不是固定的。您可能会在方法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);
            }
    

    事实上,切换到@BeforeClass将获得并提供行为,但这将是糟糕的测试实践:-PIn在这种情况下,这是糟糕的测试实践,因为执行顺序很重要。我加入了
    @BeforeClass
    ,这样OP就会明白如何从
    @BeforeClass
    之前的
    @中获得他们期望的行为。实际上,切换到@BeforeClass将提供该行为,但这将是一种糟糕的测试实践:-PIn在这种情况下,这是一种糟糕的测试实践,因为执行顺序很重要。我在课前加入了
    @BeforeClass
    ,这样OP就会明白如何从
    @课前获得他们期望的行为。