Mocking #
Mocking adalah teknik dalam pengujian perangkat lunak yang digunakan untuk membuat objek tiruan (mock) yang meniru perilaku objek nyata. Ini memungkinkan pengujian unit dengan isolasi yang lebih baik, menghindari ketergantungan pada komponen eksternal atau mahal seperti basis data, layanan web, atau sistem file. Mocking membantu dalam menguji logika aplikasi tanpa harus bergantung pada komponen luar yang mungkin tidak selalu tersedia atau memerlukan konfigurasi yang rumit.
Pustaka Mocking Populer #
Di Java, pustaka mocking yang populer termasuk:
- Mockito: Pustaka mocking yang paling banyak digunakan dan mendukung banyak fitur canggih.
- EasyMock: Pustaka lain yang menyediakan fitur mocking dengan cara yang mirip dengan Mockito.
- JMockit: Pustaka yang kuat dengan kemampuan mocking yang lebih lanjut dan fitur tambahan.
Mockito #
Mockito adalah pustaka mocking yang sangat populer dan mudah digunakan untuk pengujian unit di Java.
Menambahkan Dependensi #
Untuk menggunakan Mockito, tambahkan dependensi berikut di file build.gradle
(Gradle) atau pom.xml
(Maven).
Gradle:
testImplementation 'org.mockito:mockito-core:5.0.0'
testImplementation 'org.mockito:mockito-inline:5.0.0'
Maven:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>5.0.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>5.0.0</version>
<scope>test</scope>
</dependency>
Contoh Penggunaan #
-
Membuat Mock dan Menentukan Perilaku
import org.junit.jupiter.api.Test; import org.mockito.Mockito; import static org.mockito.Mockito.*; class MyService { private final Dependency dependency; public MyService(Dependency dependency) { this.dependency = dependency; } public String performAction() { return dependency.getData() + " processed"; } } interface Dependency { String getData(); } public class MyServiceTest { @Test void testPerformAction() { // Membuat mock dari Dependency Dependency mockDependency = Mockito.mock(Dependency.class); // Menentukan perilaku mock when(mockDependency.getData()).thenReturn("test data"); // Menggunakan mock dalam pengujian MyService service = new MyService(mockDependency); String result = service.performAction(); // Verifikasi hasil assert "test data processed".equals(result); // Verifikasi interaksi dengan mock verify(mockDependency).getData(); } }
-
Verifikasi Interaksi
Mockito memungkinkan Anda untuk memverifikasi interaksi dengan mock, memastikan bahwa metode tertentu dipanggil dengan argumen yang tepat.
import org.junit.jupiter.api.Test; import org.mockito.Mockito; import static org.mockito.Mockito.*; public class VerificationTest { @Test void testVerification() { Dependency mockDependency = Mockito.mock(Dependency.class); MyService service = new MyService(mockDependency); service.performAction(); // Verifikasi bahwa metode getData dipanggil sekali verify(mockDependency, times(1)).getData(); } }
EasyMock #
EasyMock adalah pustaka lain yang menyediakan fungsionalitas serupa dengan Mockito tetapi dengan API yang sedikit berbeda.
Menambahkan Dependensi #
Gradle:
testImplementation 'org.easymock:easymock:5.0.0'
Maven:
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
<version>5.0.0</version>
<scope>test</scope>
</dependency>
Contoh Penggunaan #
-
Membuat Mock dan Menentukan Perilaku
import org.easymock.EasyMock; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; class MyService { private final Dependency dependency; public MyService(Dependency dependency) { this.dependency = dependency; } public String performAction() { return dependency.getData() + " processed"; } } interface Dependency { String getData(); } public class MyServiceTest { @Test void testPerformAction() { // Membuat mock dari Dependency Dependency mockDependency = EasyMock.createMock(Dependency.class); // Menentukan perilaku mock EasyMock.expect(mockDependency.getData()).andReturn("test data"); // Memperbaiki mock EasyMock.replay(mockDependency); // Menggunakan mock dalam pengujian MyService service = new MyService(mockDependency); String result = service.performAction(); // Verifikasi hasil assertEquals("test data processed", result); // Verifikasi interaksi dengan mock EasyMock.verify(mockDependency); } }
JMockit #
JMockit adalah pustaka mocking yang menyediakan kemampuan mocking yang lebih canggih, termasuk mocking statis dan konstruktor.
Menambahkan Dependensi #
Gradle:
testImplementation 'org.jmockit:jmockit:1.48'
Maven:
<dependency>
<groupId>org.jmockit</groupId>
<artifactId>jmockit</artifactId>
<version>1.48</version>
<scope>test</scope>
</dependency>
Contoh Penggunaan #
-
Membuat Mock dan Menentukan Perilaku
import mockit.Mocked; import mockit.Expectations; import mockit.Tested; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import static org.junit.jupiter.api.Assertions.assertEquals; @ExtendWith(JMockitExtension.class) public class MyServiceTest { @Tested MyService service; @Mocked Dependency mockDependency; @Test void testPerformAction() { new Expectations() {{ mockDependency.getData(); result = "test data"; }}; String result = service.performAction(); assertEquals("test data processed", result); } }
Kesimpulan #
Mocking adalah teknik penting dalam pengujian unit untuk memisahkan kode yang diuji dari ketergantungan eksternal. Dengan menggunakan pustaka mocking seperti Mockito, EasyMock, atau JMockit, Anda dapat membuat objek tiruan dan menentukan perilaku mereka untuk menguji logika aplikasi dengan isolasi yang lebih baik. Mocking memungkinkan Anda untuk memverifikasi interaksi dan memastikan bahwa komponen berfungsi sesuai harapan tanpa harus bergantung pada implementasi komponen yang sebenarnya.