junit5 入门系列教程-05-junit5 断言(assert)

匿名 (未验证) 提交于 2019-12-03 00:37:01

Ŀ¼

Assert

JUnit Jupiter附带了许多JUnit 4拥有的断言方法,并添加了一些可以很好地用于Java 8 lambdas的断言方法。
所有JUnit木星断言都是 org.junit.jupiter.api.Assertions 中的静态方法断言类。

  • AssertTest.java
import org.junit.jupiter.api.Test;  import static java.time.Duration.ofMillis; import static java.time.Duration.ofMinutes; import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTimeout; import static org.junit.jupiter.api.Assertions.assertTimeoutPreemptively; import static org.junit.jupiter.api.Assertions.assertTrue;  public class AssertTest {      @Test     void standardAssertions() {         assertEquals(2, 2);         assertEquals(4, 4, "The optional assertion message is now the last parameter.");         assertTrue('a' < 'b', () -> "Assertion messages can be lazily evaluated -- "                 + "to avoid constructing complex messages unnecessarily.");     }      @Test     void groupedAssertions() {         // In a grouped assertion all assertions are executed, and any         // failures will be reported together.         Person person = new Person().getDefaultPerson();         assertAll("person",                 () -> assertEquals("John", person.getFirstName()),                 () -> assertEquals("Doe", person.getLastName())         );     }      @Test     void dependentAssertions() {         // Within a code block, if an assertion fails the         // subsequent code in the same block will be skipped.         Person person = new Person().getDefaultPerson();         assertAll("properties",                 () -> {                     String firstName = person.getFirstName();                     assertNotNull(firstName);                      // Executed only if the previous assertion is valid.                     assertAll("first name",                             () -> assertTrue(firstName.startsWith("J")),                             () -> assertTrue(firstName.endsWith("n"))                     );                 },                 () -> {                     // Grouped assertion, so processed independently                     // of results of first name assertions.                     String lastName = person.getLastName();                     assertNotNull(lastName);                      // Executed only if the previous assertion is valid.                     assertAll("last name",                             () -> assertTrue(lastName.startsWith("D")),                             () -> assertTrue(lastName.endsWith("e"))                     );                 }         );     }      @Test     void exceptionTesting() {         Throwable exception = assertThrows(IllegalArgumentException.class, () -> {             throw new IllegalArgumentException("a message");         });         assertEquals("a message", exception.getMessage());     }      @Test     void timeoutNotExceeded() {         // The following assertion succeeds.         assertTimeout(ofMinutes(2), () -> {             // Perform task that takes less than 2 minutes.         });     }      @Test     void timeoutNotExceededWithResult() {         // The following assertion succeeds, and returns the supplied object.         String actualResult = assertTimeout(ofMinutes(2), () -> {             return "a result";         });         assertEquals("a result", actualResult);     }      @Test     void timeoutNotExceededWithMethod() {         // The following assertion invokes a method reference and returns an object.         String actualGreeting = assertTimeout(ofMinutes(2), AssertTest::greeting);         assertEquals("Hello, World!", actualGreeting);     }      @Test     void timeoutExceeded() {         // The following assertion fails with an error message similar to:         // execution exceeded timeout of 10 ms by 91 ms         assertTimeout(ofMillis(10), () -> {             // Simulate task that takes more than 10 ms.             Thread.sleep(100);         });     }      @Test     void timeoutExceededWithPreemptiveTermination() {         // The following assertion fails with an error message similar to:         // execution timed out after 10 ms         assertTimeoutPreemptively(ofMillis(10), () -> {             // Simulate task that takes more than 10 ms.             Thread.sleep(100);         });     }      private static String greeting() {         return "Hello, World!";     }      private class Person {         private String firstName;         private String lastName;          public Person() {         }          public Person(String firstName, String lastName) {             this.firstName = firstName;             this.lastName = lastName;         }          public String getFirstName() {             return firstName;         }          public String getLastName() {             return lastName;         }          public Person getDefaultPerson() {             return new Person("ryo", "12222");         }     } }

尽管JUnit Jupiter提供的断言功能对于许多测试场景来说已经足够了,但是有时需要更多的功能和额外的功能,比如matchers。在这种情况下,JUnit团队推荐使用诸如AssertJ、Hamcrest、Truth等第三方断言库。因此,开发人员可以自由使用他们选择的断言库。

例如,可以使用matchers和fluent API的组合使断言更具描述性和可读性。然而, JUnit Jupiter 的 org.junit.jupiter.api.Assertions 断言类不提供类似于JUnit 4的org.junit中的assertThat()方法。
接受Hamcrest编码器的断言类。相反,鼓励开发人员使用第三方断言库提供的对匹配器的内置支持。

下面的示例演示如何在JUnit Jupiter测试中使用来自Hamcrest的assertThat()支持。
只要将Hamcrest库添加到类路径中,您就可以静态地导入诸如assertThat()、is()和equalTo()等方法,然后在像assertWithHamcrestMatcher()方法的测试中使用它们。

  • HamcrestAssertionDemo.java

当然,基于JUnit 4编程模型的遗留测试可以继续使用org.junit.Assert#assertThat。

如下:

import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat;  import org.junit.jupiter.api.Test;  class HamcrestAssertionDemo {      @Test     void assertWithHamcrestMatcher() {         assertThat(2 + 1, is(equalTo(3)));     }  }

系列导航

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!