Setup MockWebServer in minutes

Prashant Singh
2 min readJun 29, 2024

--

Hey, Android dev community! 👋

Today, let’s dive into an essential tool for testing HTTP interactions in Android apps — MockWebServer.

What is MockWebServer?

MockWebServer is a powerful library provided by Square that allows you to mock HTTP responses and simulate various network conditions in your tests. It is particularly useful for testing components that make network requests, such as API clients or repositories.

Why Use MockWebServer?

  1. Isolate Network Interactions: Test your network interactions without relying on a real server.
  2. Simulate Various Scenarios: Easily simulate different server responses, including success, error, and slow responses.
  3. Repeatable Tests: Ensure your tests are repeatable and consistent by controlling the server’s behavior.

How to Use MockWebServer in Android

Let’s walk through a simple example to understand how to set up and use MockWebServer in an Android project.

Step 1: Add Dependencies

First, add the MockWebServer dependency to your build.gradle file.

dependencies {
testImplementation 'com.squareup.okhttp3:mockwebserver:4.9.0'
}

Step 2: Create a Test for Your API Client

Assume you have an API client that fetches product details from a server.

ProductApiClient.kt:

class ProductApiClient(private val okHttpClient: OkHttpClient) {

fun getProduct(productId: String): Product {
val request = Request.Builder()
.url("https://api.example.com/products/$productId")
.build()

okHttpClient.newCall(request).execute().use { response ->
if (!response.isSuccessful) throw IOException("Unexpected code $response")

val responseBody = response.body?.string() ?: throw IOException("Response body is null")
return Gson().fromJson(responseBody, Product::class.java)
}
}
}

Step 3: Write a Test with MockWebServer

ProductApiClientTest.kt:

import com.squareup.okhttp3.mockwebserver.MockResponse
import com.squareup.okhttp3.mockwebserver.MockWebServer
import okhttp3.OkHttpClient
import org.junit.After
import org.junit.Before
import org.junit.Test
import kotlin.test.assertEquals
import kotlin.test.assertNotNull

class ProductApiClientTest {

private lateinit var mockWebServer: MockWebServer
private lateinit var productApiClient: ProductApiClient

@Before
fun setUp() {
mockWebServer = MockWebServer()
mockWebServer.start()
val baseUrl = mockWebServer.url("/").toString()

val okHttpClient = OkHttpClient()
productApiClient = ProductApiClient(okHttpClient)
}

@After
fun tearDown() {
mockWebServer.shutdown()
}

@Test
fun testGetProduct() {
val productJson = """
{
"id": "1",
"name": "Product 1",
"price": 10.0
}
""".trimIndent()

mockWebServer.enqueue(MockResponse().setBody(productJson))

val product = productApiClient.getProduct("1")
assertNotNull(product)
assertEquals("Product 1", product.name)
assertEquals(10.0, product.price)
}
}

Explanation

  1. Setup MockWebServer:
  • Initialize and start MockWebServer in the setUp method.
  • Create an instance of ProductApiClient with an OkHttpClient.

2. Enqueue Mock Response:

  • Use mockWebServer.enqueue(MockResponse().setBody(productJson)) to enqueue a mock response.

3. Write Assertions:

  • Fetch the product using productApiClient.getProduct("1") and assert the response.

Conclusion

MockWebServer is a fantastic tool for simulating network responses in your tests. It helps you ensure that your network-dependent code works correctly under various conditions. Give it a try and see how it can improve your testing strategy!

#AndroidDevelopment #MockWebServer #UnitTesting #HTTPTesting #AndroidTesting #TechCommunity #LearningEveryday

Stay tuned for more tips and tricks on Android development and testing!

--

--

Prashant Singh
Prashant Singh

Written by Prashant Singh

Senior Software Engineer at BYJUs Exam Prep

No responses yet