Get familiar with the Spring Testing and the Spring Boot Testing features.

Time: 20 minutes.

Code Snippet Manager JPA REST Testing

In this lab you will use the code from the Code Snippet Manager JPA Rest project. You will adding some tests.

  1. Open a browser and hit the url: http://start.spring.io

  2. Click the Switch to the full version link.

  3. Fill out the Code Snippet Manager JPA REST Test Project metadata with (See Figure 1.0):

    Table 1. Code Snippet Manager JPA REST Test App - metadata
    Property Value

    Group:

    io.pivotal.workshop

    Artifact:

    code-snippet-manager-jpa-rest-test

    Name:

    code-snippet-manager-jpa-rest-test

    Package Name:

    io.pivotal.workshop.snippet

    Dependencies:

    Web, DevTools, Groovy Templates, JPA, Rest Repositories, H2, MySQL

    Spring Boot:

    2.0.0.M7

    Figure 1.0: Spring Initializr - http://start.spring.io/

    SpringInitializr

    Tip
    You can choose either Maven or Gradle project types.
  4. Type Web, DevTools, Groovy Templates, JPA, Rest Repositories, H2, and MySQL in the Dependencies field and press Enter.

  5. Click the Generate Project button.

  6. Unzip the file in any directory you want.

  7. Import your project in any IDE you want.

  8. Copy all the packages (with code) into the new project. None of the code will be changed.

  9. In this lab you will use also a 3rd Party library called: Rest Assured. Add the following dependency to your pom.xml or build.gradle

    pom.xml
    <dependency>
            <groupId>io.rest-assured</groupId>
            <artifactId>spring-mock-mvc</artifactId>
            <version>3.0.0</version>
            <scope>test</scope>
    </dependency>
    build.gradle
    testCompile('io.rest-assured:spring-mock-mvc:3.0.0')
  10. Add in the src/test/java folder in the package io.pivotal.workshop.snippet the following integration test:

    io.pivotal.workshop.snippet.IntegrationTest.java
    package io.pivotal.workshop.snippet;
    
    import static io.restassured.module.mockmvc.RestAssuredMockMvc.when;
    import static org.assertj.core.api.Assertions.assertThat;
    import static org.hamcrest.CoreMatchers.equalTo;
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
    
    import java.util.Collection;
    import java.util.Collections;
    import java.util.stream.StreamSupport;
    
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
    import org.springframework.boot.test.web.client.TestRestTemplate;
    import org.springframework.core.ParameterizedTypeReference;
    import org.springframework.hateoas.Resource;
    import org.springframework.hateoas.Resources;
    import org.springframework.http.HttpMethod;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.ResponseEntity;
    import org.springframework.test.context.junit4.SpringRunner;
    import org.springframework.test.web.servlet.setup.MockMvcBuilders;
    import org.springframework.web.context.WebApplicationContext;
    
    import io.pivotal.workshop.snippet.domain.Snippet;
    import io.restassured.module.mockmvc.RestAssuredMockMvc;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
    public class IntegrationTest {
    
            @Autowired
            private TestRestTemplate restTemplate;
    
            @Autowired
            private WebApplicationContext context;
    
            @Before
            public void setUp() {
                    RestAssuredMockMvc.mockMvc(MockMvcBuilders.webAppContextSetup(context).build());
            }
    
            @Test
            public void homePageTest() {
                    String body = this.restTemplate.getForObject("/", String.class);
                    assertThat(body).contains("Hello World");
            }
    
            @Test
            public void linksTests() {
                    when().get("/api/snippets").then().assertThat(status().isOk()).body("_links.self.href",
                                    equalTo("http://localhost/api/snippets"));
            }
    }

    Take a look at the code and see that is exposing the RestAssuredMockMvc and also the usage of the TestRestTemplate.

Challenges: Integration Tests

  • Analyze the code and run the test, either using your IDE, maven or gradle.

  • Add a new test method restControllerTest that asserts the HAL/JSON response.

    Tip
    Use the ResponseEntity<Resources<Resource<Snippet>>> instance and the restTemplate.exchange method.

Challenges: Slices

  • Add a new JsonTest class and use the @JsonTest annotation. You will use the JacksonTester<T> class and the assertj library to do the assertions.

  • Add a new JpaTests class and use the @DataJpaTest annotation. You will use the TestEntityManager class and the hamcrest library to do the assertions.