Junit 5 常用註解
- @Test:標註方法為測試程試
- @BeforeEach:每項測試項目開始前都會執行一次
- @AfterEach:每項測試項目結束都會執行一次
- @BeforeAll:測試開始之前執行一次
- @AfterAll:測試結束之後執行一次
- @Disabled:不列入測試項目
- @DisplayName:測試結果顯示特定名稱
延伸先前計算相關的方法測試,我們補齊加減乘除各種方法跟測試
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class Calculator {
public int add(int x, int y) { return x + y; }
public int subtract(int x, int y) { return x - y; }
public int multiply(int x, int y) { return x * y; }
public int divide(int x, int y) { if (y == 0) { throw new IllegalArgumentException("Cannot divide by zero"); } return x / y; } }
|
測試類也加上對應的測試
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| class CalculatorTest { @Test public void testAdd() { Calculator calc = new Calculator(); int result = calc.add(1, 1); assertEquals(2, result); }
@Test public void testSubtract() { Calculator calc = new Calculator(); int result = calc.subtract(3, 1); assertEquals(2, result); }
@Test public void testMultiply() { Calculator calc = new Calculator(); int result = calc.multiply(3, 2); assertEquals(6, result); }
@Test public void testDivide() { Calculator calc = new Calculator(); int result = calc.divide(2, 2); assertEquals(1, result, "result should be 1"); assertThrows(IllegalArgumentException.class, () -> { calc.divide(2, 0); }); } }
|
把這些註解都應用到我們的測試案例裡
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| class CalculatorTest {
private Calculator calc;
@BeforeEach void initCalculator() { System.out.println("-----每個項目執行前我都執行一次 @BeforeEach-----"); calc = new Calculator(); }
@AfterEach void tearDownCalculator() { System.out.println("-----每個項目執行完我都執行一次 @AfterEach-----"); calc = null; }
@BeforeAll static void beforeAll() { System.out.println("=====全部開始前是我 @BeforeAll====="); }
@AfterAll static void afterAll() { System.out.println("=====全部結束後是我 @AfterAll====="); }
@Test @DisplayName("加法測試") public void testAdd() { System.out.println("執行 testAdd()"); int result = calc.add(1, 1); assertEquals(2, result); }
@Test @DisplayName("減法測試") public void testSubtract() { System.out.println("執行 testSubtract()"); int result = calc.subtract(3, 1); assertEquals(2, result); }
@Test public void testMultiply() { System.out.println("執行 testMultiply()"); int result = calc.multiply(3, 2); assertEquals(6, result); }
@Test @Disabled public void testDivide() { System.out.println("執行 testDivide()"); int result = calc.divide(2, 2); assertEquals(1, result, "result should be 1"); assertThrows(IllegalArgumentException.class, () -> { calc.divide(2, 0); }); } }
|
可以觀察到前面的方法因為都需要初始化 Calculator ,所以可以運用到 @BeforeEach 這個註解來幫我們讓程式碼更簡潔。
每個測試結束後也可以加入 @AfterEach 來進行特定處理,這邊就假設我們需要釋出空間把 calc 清空
依據測試需要也可以用 @BeforeAll @AfterAll 可以在最一開始及最後進行一些處理,不管你執行的是單項測試或是全部一起,這兩種都會最先和最後被執行。
@DisplayName 則是可以直接改變執行結果顯示的測試名稱
@Disabled 會跳過該項目,不被執行,但還是會在執行結果中顯示有被禁用
把每個執行都加上 log 之後可以看一下執行結果
可以看到對應的 log 就知道那些執行的順序,是否回想起這就是 AOP 的應用了!! 其實在測試撰寫的時候也都會用到這樣的概念。
參考資料: