📜  断言多个 junit - Java (1)

📅  最后修改于: 2023-12-03 15:10:24.358000             🧑  作者: Mango

断言多个 JUnit - Java

JUnit是Java中最常用的测试框架之一。JUnit提供了很多的断言方法,用于测试代码的正确性。在实际开发过程中,我们需要同时验证多个条件是否满足,这时,就需要使用多个断言方法来测试代码的正确性。

多个断言方法

JUnit提供了很多的断言方法,比如assertEquals(),assertNotNull(),assertTrue()等。在JUnit 4.4版本之后,JUnit提供了一种更加方便的方式来进行多个断言的测试。

import org.junit.Test;
import org.junit.jupiter.api.Assertions;

public class ExampleTest {

    @Test
    public void test() {
        Assertions.assertAll("test",
        () -> Assertions.assertEquals(1, 1),
        () -> Assertions.assertTrue(1 == 1),
        () -> Assertions.assertNotNull("not null"),
        () -> Assertions.assertNotEquals(1, 2));
    }
}

在上面的代码中,我们使用了Assertions.assertAll()方法来执行多个断言。Assertions.assertAll()方法的第一个参数是一个描述信息,类似于@Test注解的参数。后面的参数是多个断言方法,并使用lambda表达式来执行具体的断言。

断言组

在JUnit 5中,我们可以使用Assertions的一个新特性:断言组。断言组可以用来将多个断言方法放到一起进行测试,并且支持嵌套的方式。

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;

@DisplayName("A stack")
public class StackTest {
    Stack<String> stack = new Stack<>();

    @Test
    @DisplayName("is instantiated with new Stack()")
    void isInstantiatedWithNew() {
        new Stack<>();
    }

    @Nested
    @DisplayName("when new")
    class WhenNew {
        @Test
        @DisplayName("is empty")
        void isEmpty() {
            Assertions.assertTrue(stack.isEmpty());
        }

        @Test
        @DisplayName("throws EmptyStackException when popped")
        void throwsExceptionWhenPopped() {
            Assertions.assertThrows(EmptyStackException.class, stack::pop);
        }

        @Test
        @DisplayName("throws EmptyStackException when peeked")
        void throwsExceptionWhenPeeked() {
            Assertions.assertThrows(EmptyStackException.class, stack::peek);
        }

        @Nested
        @DisplayName("after pushing an element")
        class AfterPushing {
            String element = "an element";

            @BeforeEach
            void pushElement() {
                stack.push(element);
            }

            @Test
            @DisplayName("it is no longer empty")
            void isNotEmpty() {
                Assertions.assertFalse(stack.isEmpty());
            }

            @Test
            @DisplayName("returns the element when popped and is empty")
            void returnElementWhenPopped() {
                Assertions.assertEquals(element, stack.pop());
                Assertions.assertTrue(stack.isEmpty());
            }

            @Test
            @DisplayName("returns the element when peeked but remains not empty")
            void returnElementWhenPeeked() {
                Assertions.assertEquals(element, stack.peek());
                Assertions.assertFalse(stack.isEmpty());
            }
        }
    }
}

在上面的代码中,我们使用了@Nested注解来定义嵌套测试类。@Nested注解还可以与@BeforeAll,@AfterAll,@BeforeEach和@AfterEach注解一起使用。此外,我们还使用了@DisplayName注解来为测试输出更加友好的信息。最后,我们使用了多个断言方法来执行具体的断言。如果有任何一个断言方法失败,整个测试也将失败。