Friday, September 18, 2020

Testing with Hoverfly and Java Part 2: Delays

Oracle Java Tutorial and Material, Oracle Java Learning, Oracle Java Exam Prep

On the previous post we implemented json and Java based Hoverfly scenarios..

Now it’s time to dive deeper and use other Ηoverfly features.

A big part of testing has to do with negative scenarios. One of them is delays. Although we always mock a server and we are successful to reproduce erroneous scenarios one thing that is key to simulate in todays microservices driven world is delay.

Oracle Java Tutorial and Material, Oracle Java Learning, Oracle Java Exam Prep

So let me make a server with a 30 secs delay.

public class SimulateDelayTests {

    private Hoverfly hoverfly;

    @BeforeEach

    void setUp() {

        var simulation = SimulationSource.dsl(service("http://localhost:8085")

                .get("/delay")

                .willReturn(success("{\"username\":\"test-user\"}", "application/json").withDelay(30, TimeUnit.SECONDS)));

        var localConfig = HoverflyConfig.localConfigs().disableTlsVerification().asWebServer().proxyPort(8085);

        hoverfly = new Hoverfly(localConfig, SIMULATE);

        hoverfly.start();

        hoverfly.simulate(simulation);

    }

    @AfterEach

    void tearDown() {

        hoverfly.close();

    }

}

Let’s add the Delay Test

@Test

void testWithDelay() {

   var client = HttpClient.newHttpClient();

   var request = HttpRequest.newBuilder()

         .uri(URI.create("http://localhost:8085/delay"))

         .build();

   var start = Instant.now();

   var res = client.sendAsync(request, HttpResponse.BodyHandlers.ofString())

         .thenApply(HttpResponse::body)

         .join();

   var end = Instant.now();

   Assertions.assertEquals("{\"username\":\"test-user\"}", res);

   var seconds = Duration.between(start, end).getSeconds();

   Assertions.assertTrue(seconds >= 30);

}

Delay simulation is there, up and running, so let’s try to simulate timeouts.

@Test

    void testTimeout() {

        var client = HttpClient.newHttpClient();

        var request = HttpRequest.newBuilder()

                .uri(URI.create("http://localhost:8085/delay"))

                .timeout(Duration.ofSeconds(10))

                .build();

        assertThrows(HttpTimeoutException.class, () -> {

                    try {

                        client.sendAsync(request, HttpResponse.BodyHandlers.ofString()).join();

                    } catch (CompletionException ex) {

                        throw ex.getCause();

                    }

                }

        );

    }

Related Posts

0 comments:

Post a Comment