Trong bài viết trước Tổng quan về Mock trong Unit Test, mình đã giới thiệu với các bạn một cách để mock một đối tượng sử dụng class Mockito, Mockito còn hỗ trợ chúng ta một cách nữa để khởi tạo đối tượng Mock đó chính là sử dụng annotation @Mock. Cụ thể như thế nào? Chúng ta hãy cùng nhau tìm hiểu trong bài viết này các bạn nhé!
Đầu tiên, mình sẽ tạo mới một Maven project để làm ví dụ:
Với Mockito và JUnit dependencies như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-junit-jupiter</artifactId> <version>3.6.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.7.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.7.0</version> <scope>test</scope> </dependency> |
Với JUnit 5, để chạy được Unit Test với Maven, chúng ta cần khai báo plugin maven-surefire-plugin của Maven với latest version như sau:
1 2 3 4 5 6 7 8 |
<build> <plugins> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> </plugin> </plugins> </build> |
Và compile source với target sử dụng Java 8 trở đi:
1 2 3 4 |
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> |
Trong bài viết này, mình cũng tạo một ứng dụng tương tự như bài viết trước nhưng lúc này class Calculation sẽ định nghĩa một phương thức để tính hiệu của 2 số.
1 2 3 4 5 6 7 8 9 |
package com.huongdanjava.mockito; public class Calculation { public int sub(int a, int b) { return a - b; } } |
Còn class Application sẽ có một method sử dụng phương thức của class Calculation để tính hiệu của 2 số, nếu kết quả lớn hơn 0 thì sẽ trả về true, ngược lại sẽ là false.
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 |
package com.huongdanjava.mockito; public class Application { private Calculation calculation; public boolean check(int a, int b) { int result = calculation.sub(a, b); return result > 0; } public Calculation getCalculation() { return calculation; } public void setCalculation(Calculation calculation) { this.calculation = calculation; } public static void main(String[] args) { Application a = new Application(); a.setCalculation(new Calculation()); if (a.check(2, 4)) { System.out.println("Positive"); } else { System.out.println("Negative"); } } } |
Giờ mình sẽ viết Unit Test cho class Application sử dụng đối tượng mock của class Calculation với đối tượng mock của class Calculation được tạo bằng cách sử dụng annotation @Mock.
Với annotation @Mock, để khởi tạo đối tượng mock cho class Calculation, đầu tiên chúng ta cần khai báo class Calculation với annotation @Mock bên trong class ApplicationTest như sau:
1 2 3 4 5 6 7 8 9 10 |
package com.huongdanjava.mockito; import org.mockito.Mock; public class ApplicationTest { @Mock private Calculation calculation; } |
Tiếp theo, chúng ta cần khai báo MockitoExtension.class với annotation @ExtendWith của JUnit 5 bên trên class ApplicationTest như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package com.huongdanjava.mockito; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) public class ApplicationTest { @Mock private Calculation calculation; } |
Với extension này, Mockito sẽ scan class ApplicationTest của chúng ta để lấy hết tất cả các class mà chúng ta khai báo với annotation @Mock để thực hiện việc tạo mock object.
Code để test phương thức check() của class Application như sau:
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 |
package com.huongdanjava.mockito; import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) public class ApplicationTest { @Mock private Calculation calculation; @Test public void testCheck() { Application application = new Application(); application.setCalculation(calculation); Mockito.when(calculation.sub(2, 12)).thenReturn(-10); int a = 2; int b = 12; boolean c = application.check(a, b); assertEquals(false, c); } } |
Bây giờ thì chúng ta có thể chạy lại Unit Test để kiểm tra kết quả rồi nhé các bạn!
Kết quả:
1 2 3 4 5 6 7 8 9 10 |
[INFO] ------------------------------------------------------- [INFO] T E S T S [INFO] ------------------------------------------------------- [INFO] Running com.huongdanjava.mockito.ApplicationTest [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.484 s - in com.huongdanjava.mockito.ApplicationTest [INFO] [INFO] Results: [INFO] [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] |