➜ Old React website
Chung Cheuk Hang MichaelJava Web Developer
Java 測試(三):MockitoJava 測試(一):簡介

Java 測試(二):JUnit

Continued from previous post:
Java 測試(一):簡介

Table of contents

2 JUnit 4

2.1 Maven dependencies

1<dependency> 2 <groupId>junit</groupId> 3 <artifactId>junit</artifactId> 4 <version>4.13.2</version> 5 <scope>test</scope> 6</dependency>
如果係用緊新版既 Spring Boot,咁佢就已經用緊 JUnit 5。JUnit 5 係一個完全唔同既新版,所以如果要用返 JUnit 4 既話,可以用以下既 dependency,裡面已經包括左 junit 版本 4.x
<dependency> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> <scope>test</scope> </dependency>

2.2 寫 Java code

Production code:
1public final class StringUtils { 2 3 private StringUtils() {} 4 5 public static boolean isBlank(String str) { 6 return str==null 7 || str.isEmpty() 8 || str.chars().allMatch(Character::isWhitespace); 9 } 10}
Test code:
1public class StringUtilsTest { 2 3 @Test 4 public void test_isBlank_null() { 5 Assert.assertTrue(StringUtils.isBlank(null)); 6 } 7 8 @Test 9 public void test_isBlank_emptyString() { 10 Assert.assertTrue(StringUtils.isBlank("")); 11 } 12 13 @Test 14 public void test_isBlank_spaces() { 15 Assert.assertTrue(StringUtils.isBlank(" ")); 16 } 17 18 @Test 19 public void test_isBlank_specialWhitespaceCharacter1() { 20 Assert.assertTrue(StringUtils.isBlank("\u005Ct")); 21 } 22 23 @Test 24 public void test_isBlank_specialWhitespaceCharacter2() { 25 Assert.assertTrue(StringUtils.isBlank("\u005Cn")); 26 } 27 28 @Test 29 public void test_isBlank_someCharacters() { 30 Assert.assertFalse(StringUtils.isBlank("a")); 31 } 32}

2.3 JUnit API

2.3.1 Annotations

2.3.1.1 @Test

最基本會畀 JUnit pick up 去 run 既 test method:
@Test public void test() { // test code }
如果期望個 test 會出 exception:
@Test(expected = RuntimeException.class) // 改成我地期望既 exception class public void test() { throw new RuntimeException(); }

2.3.1.2 @Before

有時我地會想喺每個 test case 行之前 set 一啲野,咁可以加個 method(method 名冇所謂):
@Before public void setUp() { // do something }

2.3.1.3 @BeforeClass

同樣地,如果只想喺行成個 test class 一開始行一次去 set 一啲野,咁可以加個 static method(method 名冇所謂):
@BeforeClass public static void setUpOnce() { // do something }

2.3.1.4 @After

如果需要喺每個 test case 行完之後收拾返一啲野,咁可以加個 method(method 名冇所謂):
@After public void tearDown() { // do something }

2.3.1.5 @AfterClass

同樣地,如果只想喺行成個 test class 最後尾行一次去收拾返一啲野,咁可以加個 static method(method 名冇所謂):
@AfterClass public static void tearDownOnce() { // do something }

2.3.2 Assertion methods

2.3.2.1 assertNullassertNotNull

Assert.assertNull(null); Assert.assertNotNull("");

2.3.2.2 assertTrueassertFalse

Assert.assertTrue(true); Assert.assertFalse(false);

2.3.2.3 assertEquals

final String expected = "Hello World!"; final String actual = "Hello" + " " + "World!"; Assert.assertEquals(expected, actual);

2.3.2.4 fail

如果想個 test method 去到某一行就會 fail 左個 test case,就用呢句:
Assert.fail();

2.4 Parameterized test

1@RunWith(Parameterized.class) 2@FieldDefaults(level = PRIVATE) 3@AllArgsConstructor 4public class MyParameterizedTest { 5 6 String value; 7 boolean expected; 8 9 @Parameters 10 public static Collection<Object[]> params() { 11 return Arrays.asList(new Object[][] { 12 { "123", false }, 13 { "", true } 14 }); 15 } 16 17 @Test 18 public void test() { 19 final boolean actual = StringUtils.isBlank(value); 20 Assert.assertEquals(expected, actual); 21 } 22}
參考資料: