Akka-Http: как тайм-аут строгой сущности HttpResponse в тесте - PullRequest
0 голосов
/ 14 июня 2019

Вот мой код

import akka.http.javadsl.Http
// some initialization omitted

inline fun <reified T> executeRequest(request: HttpRequest, crossinline onError: (HttpResponse) -> Unit): CompletionStage<T?> {
    val unmarshaller = GsonMarshaller.unmarshaller(T::class.java)
    return http.singleRequest(request).thenCompose { httpResponse: HttpResponse ->
        if (httpResponse.status() == StatusCodes.OK || httpResponse.status() == StatusCodes.CREATED) {
            unmarshaller.unmarshal(httpResponse.entity().withContentType(ContentTypes.APPLICATION_JSON), dispatcher, materializer)
        } else {
            onError(httpResponse) // invoke lambda to notify of error
            httpResponse.discardEntityBytes(materializer)
            CompletableFuture.completedFuture(null as T?)
        }
    }
}

class TradingActor(
    val materializer: ActorMaterializer,
    val dispatcher: ExecutionContextExecutor
): AbstractLoggingActor() {

    fun submitNewOrder(request: Request, onFailed: (text: String) -> Unit) {
        executeRequest<OrderAnswer>(request) {
            it.entity().toStrict(5_000, materializer).thenApply { entity ->
                onFailed("API Call Failed")
            }
        }.thenAccept {
            println("OK")
        }
    }
}

Я должен написать тест, проверяющий, что если истекает .entity().toStrict(5_000, materializer) тайм-аут, вызывается onFailed("API Call Failed"). Текущий код не вызывает onFailed("") в случае тайм-аута, поэтому я хочу этот тест.

мой тест содержит

val response = akka.http.javadsl.model.HttpResponse.create()
    .withStatus(StatusCodes.OK)
    .withEntity("""{'s': 'text'}""")

Mockito.`when`(http.singleRequest(any()))
.then {
    CompletableFuture.completedFuture<akka.http.javadsl.model.HttpResponse>(response)
}

но я не знаю, как заставить toStrict() истечь.

1 Ответ

0 голосов
/ 16 июня 2019

Как я понял из вашего вопроса, вы можете создать фиктивный объект для ResponseEntity и создать собственную реализацию для toStrict () метода, который будет иметь задержку. Что-то вроде приведенного ниже примера -> Могу ли я отложить ответ меткого метода с помощью Mockito? .

when(mock.load("a")).thenAnswer(new Answer<String>() {
   @Override
   public String answer(InvocationOnMock invocation){
     Thread.sleep(5000);
     return "ABCD1234";
   }
});

Чем вы можете установить его в своем объекте ответа.

val response = akka.http.javadsl.model.HttpResponse.create()
    .withStatus(StatusCodes.OK)
    .withEntity(mockedEntity)
...