KEMBAR78
Testing Spring Boot Applications | PDF
Testing Spring Boot
Applications
Andy Wilkinson
@ankinson
@ankinson
Why Bother Testing At All?
@ankinson
@ankinson
Risk
None
YOLO
Tests
0 Lots
@ankinson
@ankinson
Unit Tests
@ankinson
@ankinson
MockRestServiceServer
OkHTTP’s MockWebServer
Spring Data Repositories
JdbcTemplate
@ankinson
Testcontainers
@ankinson
https://www.testcontainers.org
@ankinson
@SpringBootTest
@Testcontainers(disabledWithoutDocker = true)
@ContextConfiguration(initializers = ExampleIntegrationTests.Initializer.class)
class ExampleIntegrationTests {
@Container
public static CassandraContainer<?> cassandra = new CassandraContainer<>();
static class Initializer
implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext context) {
int cqlPort = cassandra.getMappedPort(CassandraContainer.CQL_PORT);
TestPropertyValues.of("spring.data.cassandra.port=" + cqlPort)
.applyTo(context.getEnvironment());
}
}
}
@ankinson
Integration Tests
@ankinson
@SpringBootTest
@ankinson
Context Caching
@ankinson
@SpringBootTest(properties="spring.jmx.enabled=true")
@ActiveProfiles("standalone")
@TestPropertySource(locations="standalone.properties")
class ExampleIntegrationTests {
@Test
void contextLoads() {
}
}
@ContextConfiguration
@Import
@TestPropertySource
@ActiveProfiles
@SpringBootTest
@ankinson
@DirtiesContext
@ankinson
Sliced Tests
@ankinson
@JsonTest
@WebMvcTest
@WebFluxTest
@DataJpaTest
@JdbcTest
@JooqTest
@DataMongoTest
@DataNeo4jTest
@DataRedisTest
@DataLdapTest
@RestClientTest
@ankinson
@WebMvcTest@DataJpaTest
OrderRepository
extends JpaRepository<…>
@Controller
OrderController
@Controller
CustomerController
CustomerRepository
extends JpaRepository<…>
@SpringBootApplication
Application
@ankinson
@MockBean and @SpyBean
@ankinson
@WebMvcTest
class CustomerControllerIntegrationTests {
@Autowired
private MockMvc mockMvc;
@Configuration
static class RepositoryConfiguration {
@Bean
CustomerRepository customers() {
return mock(CustomerRepository.class);
}
@Bean
OrderRepository orders() {
return mock(OrderRepository.class);
}
}
}
@ankinson
Customer
Customer
Order
@WebMvcTest
class CustomerControllerTests {
@Autowired
private MockMvc mockMvc;
@MockBean
private CustomerRepository customers;
@MockBean
private OrderRepository orders;
}
😱
(controllers = CustomerController.class)
JUnit 5: Evolution and
Innovation
Sam Brannen
Thursday
10:30am–11:40am
Ballroom F
Thanks!
Q&A
Andy Wilkinson
@ankinson
#springone@s1p

Testing Spring Boot Applications