Distrito Telefónica. Hub de Innovación y Talento
Ejemplo de uso inicial
employees.json
[
{
"id": "id_01",
"name": "Paul",
"surname": "Smith",
"age": 25,
"position": "Engineer"
},
{
... // More employees
}
]
Ahora, todo lo que queda es poner en cola las respuestas para cada solicitud de ruta específica, definiendo la respuesta precisa que pretendemos recibir.
class EnqueueMockResponses @Inject constructor(
private val mockHelper: MockHelper
) {
fun enqueueEmployeeList() {
mockHelper.enqueue {
whenever(
path = "/our_endpoint_route/employees",
method = Method.Get
).thenReturnFromFile(
pathFromFile = "employees.json",
httpResponseCode = 200,
delayInMillis = 2000L
)
}
}
}
Exploremos el funcionamiento interno de la biblioteca.
Primer paso: Configurar la biblioteca
fun setUp(
port: Int = 0,
enableSsl: Boolean = false,
) {
mockApiClient.setUp(enableSsl = enableSsl)
mockApiClient.startServer(port)
}
En los casos en los que no se especifica el puerto, el servidor selecciona dinámicamente un puerto disponible durante la inicialización. Una vez inicializado el servidor, la configuración de nuestro cliente HTTP resulta sencilla. Un paso fundamental consiste en informar al cliente de la URL base para nuestras solicitudes, que se obtiene del servidor recién lanzado.
suspend fun getBaseUrl(): String = mockApiClient.getBaseUrl()
Segundo paso: Proporcionar respuestas simuladas
fun enqueue(block: EnqueuingContext.() -> Unit) = block(EnqueuingContext(this))class EnqueuingContext(val mockHelper: MockHelper) {
fun whenever(
path: Path,
method: Method = Method.Get
): MockResponseBuilderWithRequestInfo = MockResponseBuilderWithRequestInfo(mockHelper, RequestInfo(path, method))
}class MockResponseBuilderWithRequestInfo(
private val mockHelper: MockHelper,
private val requestInfo: RequestInfo,
) {
fun thenReturnFromFile(
pathFromFile: String,
httpResponseCode: Int = MockedResponse.DEFAULT_MOCK_HTTP_RESPONSE_CODE,
delayInMillis: Long = MockedResponse.DEFAULT_MOCK_DELAY_IN_MILLIS,
) {
mockHelper.mockApiClient.enqueue(
requestInfo = requestInfo,
mockedResponse = MockedApiResponse(
body = mockHelper.fileReader.readJsonFile(pathFromFile) ?: MockedApiResponse.DEFAULT_BODY,
httpResponseCode = httpResponseCode,
delayInMillis = delayInMillis,
)
)
}
}
La coincidencia de las rutas especificadas se realiza utilizando Regex; de esta forma, permitimos la imitación de solicitudes con valores dinámicos.
fun enqueueEmployeeList() {
mockHelper.enqueue {
whenever(
path = "api/.*/our_endpoint_route?employee_id=.*",
method = Method.Get
).thenReturnFromFile(
pathFromFile = "employee_detail.json",
httpResponseCode = 200,
delayInMillis = 2000L
)
}
}
https://localhost:8080//api/1.0.0/our_endpoint_route?employee_id=001
https://localhost:8080//api/1.0.1/our_endpoint_route?employee_id=002
Tercer paso: Crear respuestas JSON
Nuestra biblioteca de servidores Mock Api para Android