Polish "Add test slice for Spring Data Cassandra"

See gh-17490
This commit is contained in:
Stephane Nicoll
2020-08-05 10:53:20 +02:00
parent ae152b176b
commit 313b2bef6f
22 changed files with 174 additions and 162 deletions

View File

@@ -19,6 +19,7 @@ package org.springframework.boot.test.autoconfigure.actuate.metrics;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration;
/**
* Example {@link SpringBootApplication @SpringBootApplication} for use with
@@ -27,7 +28,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
* @author Chris Bono
*/
@SpringBootConfiguration
@EnableAutoConfiguration
@EnableAutoConfiguration(exclude = CassandraAutoConfiguration.class)
class AutoConfigureMetricsSpringBootApplication {
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2012-2019 the original author or authors.
* Copyright 2012-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,23 +16,25 @@
package org.springframework.boot.test.autoconfigure.data.cassandra;
import java.time.Duration;
import java.util.UUID;
import com.datastax.driver.core.Cluster;
import com.datastax.oss.driver.api.core.CqlSession;
import com.datastax.oss.driver.api.core.CqlSessionBuilder;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.CassandraContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.data.redis.ExampleService;
import org.springframework.boot.test.util.TestPropertyValues;
import org.springframework.boot.testsupport.testcontainers.CassandraContainer;
import org.springframework.boot.testsupport.testcontainers.DisabledWithoutDockerTestcontainers;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.data.cassandra.core.CassandraTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.DynamicPropertyRegistry;
import org.springframework.test.context.DynamicPropertySource;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
@@ -42,13 +44,21 @@ import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
*
* @author Artsiom Yudovin
*/
@DisabledWithoutDockerTestcontainers
@ContextConfiguration(initializers = DataCassandraTestIntegrationTests.Initializer.class)
@DataCassandraTest
@DataCassandraTest(properties = { "spring.data.cassandra.local-datacenter=datacenter1",
"spring.data.cassandra.schema-action=create-if-not-exists",
"spring.data.cassandra.connection.connect-timeout=10s", "spring.data.cassandra.request.timeout=5s" })
@Testcontainers(disabledWithoutDocker = true)
class DataCassandraTestIntegrationTests {
@Container
public static CassandraContainer cassandra = new CassandraContainer();
static final CassandraContainer<?> cassandra = new CassandraContainer<>().withStartupAttempts(5)
.withStartupTimeout(Duration.ofMinutes(10));
@DynamicPropertySource
static void cassandraProperties(DynamicPropertyRegistry registry) {
registry.add("spring.data.cassandra.contact-points",
() -> cassandra.getHost() + ":" + cassandra.getFirstMappedPort());
}
@Autowired
private CassandraTemplate cassandraTemplate;
@@ -67,36 +77,28 @@ class DataCassandraTestIntegrationTests {
@Test
void testRepository() {
Person person = new Person();
person.setDescription("Look, new @DataCassandraTest!");
ExampleEntity entity = new ExampleEntity();
entity.setDescription("Look, new @DataCassandraTest!");
String id = UUID.randomUUID().toString();
person.setId(id);
Person savedEntity = this.exampleRepository.save(person);
Person getEntity = this.cassandraTemplate.selectOneById(id, Person.class);
entity.setId(id);
ExampleEntity savedEntity = this.exampleRepository.save(entity);
ExampleEntity getEntity = this.cassandraTemplate.selectOneById(id, ExampleEntity.class);
assertThat(getEntity).isNotNull();
assertThat(getEntity.getId()).isNotNull();
assertThat(getEntity.getId()).isEqualTo(savedEntity.getId());
this.exampleRepository.deleteAll();
}
static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@TestConfiguration(proxyBeanMethods = false)
static class KeyspaceTestConfiguration {
@Override
public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
TestPropertyValues.of("spring.data.cassandra.port=" + cassandra.getFirstMappedPort())
.and("spring.data.cassandra.keyspaceName=test")
.and("spring.data.cassandra.schema-action=CREATE_IF_NOT_EXISTS")
.applyTo(configurableApplicationContext.getEnvironment());
Cluster cluster = Cluster.builder().withoutJMXReporting()
.addContactPoints(cassandra.getContainerIpAddress()).withPort(cassandra.getFirstMappedPort())
.build();
cluster.connect().execute("CREATE KEYSPACE test "
+ "WITH replication = {'class':'SimpleStrategy', 'replication_factor' : 1};");
@Bean
CqlSession cqlSession(CqlSessionBuilder cqlSessionBuilder) {
try (CqlSession session = cqlSessionBuilder.build()) {
session.execute("CREATE KEYSPACE IF NOT EXISTS boot_test"
+ " WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };");
}
return cqlSessionBuilder.withKeyspace("boot_test").build();
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2012-2019 the original author or authors.
* Copyright 2012-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,19 +16,19 @@
package org.springframework.boot.test.autoconfigure.data.cassandra;
import com.datastax.oss.driver.api.core.CqlSession;
import com.datastax.oss.driver.api.core.context.DriverContext;
import com.datastax.oss.driver.api.core.type.codec.registry.CodecRegistry;
import org.junit.jupiter.api.Test;
import org.testcontainers.junit.jupiter.Container;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.util.TestPropertyValues;
import org.springframework.boot.testsupport.testcontainers.CassandraContainer;
import org.springframework.boot.testsupport.testcontainers.DisabledWithoutDockerTestcontainers;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;
import org.springframework.test.context.ContextConfiguration;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
/**
* Tests for the {@link DataCassandraTest#properties properties} attribute of
@@ -36,14 +36,9 @@ import static org.assertj.core.api.Assertions.assertThat;
*
* @author Artsiom Yudovin
*/
@DisabledWithoutDockerTestcontainers
@ContextConfiguration(initializers = DataCassandraTestPropertiesIntegrationTests.Initializer.class)
@DataCassandraTest(properties = "spring.profiles.active=test")
class DataCassandraTestPropertiesIntegrationTests {
@Container
public static final CassandraContainer cassandra = new CassandraContainer();
@Autowired
private Environment environment;
@@ -52,12 +47,17 @@ class DataCassandraTestPropertiesIntegrationTests {
assertThat(this.environment.getActiveProfiles()).containsExactly("test");
}
static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@TestConfiguration(proxyBeanMethods = false)
static class CassandraMockConfiguration {
@Override
public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
TestPropertyValues.of("spring.data.cassandra.port=" + cassandra.getFirstMappedPort())
.applyTo(configurableApplicationContext.getEnvironment());
@Bean
CqlSession cqlSession() {
DriverContext context = mock(DriverContext.class);
CodecRegistry codecRegistry = mock(CodecRegistry.class);
given(context.getCodecRegistry()).willReturn(codecRegistry);
CqlSession cqlSession = mock(CqlSession.class);
given(cqlSession.getContext()).willReturn(context);
return cqlSession;
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2012-2019 the original author or authors.
* Copyright 2012-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,21 +16,23 @@
package org.springframework.boot.test.autoconfigure.data.cassandra;
import java.time.Duration;
import java.util.UUID;
import com.datastax.driver.core.Cluster;
import com.datastax.oss.driver.api.core.CqlSession;
import com.datastax.oss.driver.api.core.CqlSessionBuilder;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.CassandraContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.util.TestPropertyValues;
import org.springframework.boot.testsupport.testcontainers.CassandraContainer;
import org.springframework.boot.testsupport.testcontainers.DisabledWithoutDockerTestcontainers;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.stereotype.Service;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.DynamicPropertyRegistry;
import org.springframework.test.context.DynamicPropertySource;
import static org.assertj.core.api.Assertions.assertThat;
@@ -40,13 +42,22 @@ import static org.assertj.core.api.Assertions.assertThat;
*
* @author Artsiom Yudovin
*/
@DisabledWithoutDockerTestcontainers
@ContextConfiguration(initializers = DataCassandraTestWithIncludeFilterIntegrationTests.Initializer.class)
@DataCassandraTest(includeFilters = @Filter(Service.class))
@DataCassandraTest(includeFilters = @Filter(Service.class),
properties = { "spring.data.cassandra.local-datacenter=datacenter1",
"spring.data.cassandra.schema-action=create-if-not-exists",
"spring.data.cassandra.connection.connect-timeout=10s", "spring.data.cassandra.request.timeout=5s" })
@Testcontainers(disabledWithoutDocker = true)
class DataCassandraTestWithIncludeFilterIntegrationTests {
@Container
public static final CassandraContainer cassandra = new CassandraContainer();
static final CassandraContainer<?> cassandra = new CassandraContainer<>().withStartupAttempts(5)
.withStartupTimeout(Duration.ofMinutes(10));
@DynamicPropertySource
static void cassandraProperties(DynamicPropertyRegistry registry) {
registry.add("spring.data.cassandra.contact-points",
() -> cassandra.getHost() + ":" + cassandra.getFirstMappedPort());
}
@Autowired
private ExampleRepository exampleRepository;
@@ -56,30 +67,24 @@ class DataCassandraTestWithIncludeFilterIntegrationTests {
@Test
void testService() {
Person person = new Person();
person.setDescription("Look, new @DataCassandraTest!");
ExampleEntity exampleEntity = new ExampleEntity();
exampleEntity.setDescription("Look, new @DataCassandraTest!");
String id = UUID.randomUUID().toString();
person.setId(id);
this.exampleRepository.save(person);
assertThat(this.service.hasRecord(person)).isTrue();
exampleEntity.setId(id);
this.exampleRepository.save(exampleEntity);
assertThat(this.service.hasRecord(exampleEntity)).isTrue();
}
static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@TestConfiguration(proxyBeanMethods = false)
static class KeyspaceTestConfiguration {
@Override
public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
TestPropertyValues.of("spring.data.cassandra.port=" + cassandra.getFirstMappedPort())
.and("spring.data.cassandra.keyspaceName=test")
.and("spring.data.cassandra.schema-action=CREATE_IF_NOT_EXISTS")
.applyTo(configurableApplicationContext.getEnvironment());
Cluster cluster = Cluster.builder().withoutJMXReporting()
.addContactPoints(cassandra.getContainerIpAddress()).withPort(cassandra.getFirstMappedPort())
.build();
cluster.connect().execute("CREATE KEYSPACE test "
+ "WITH replication = {'class':'SimpleStrategy', 'replication_factor' : 1};");
@Bean
CqlSession cqlSession(CqlSessionBuilder cqlSessionBuilder) {
try (CqlSession session = cqlSessionBuilder.build()) {
session.execute("CREATE KEYSPACE IF NOT EXISTS boot_test"
+ " WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };");
}
return cqlSessionBuilder.withKeyspace("boot_test").build();
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2012-2019 the original author or authors.
* Copyright 2012-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -22,7 +22,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
* Example {@link SpringBootApplication @SpringBootApplication} used with
* {@link DataCassandraTest @DataCassandraTest} tests.
*
* @author Jayaram Pradhan
* @author Artsiom Yudovin
*/
@SpringBootApplication
public class ExampleCassandraApplication {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2012-2019 the original author or authors.
* Copyright 2012-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -25,7 +25,7 @@ import org.springframework.data.cassandra.core.mapping.Table;
* @author Artsiom Yudovin
*/
@Table
public class Person {
public class ExampleEntity {
@PrimaryKey
private String id;

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2012-2019 the original author or authors.
* Copyright 2012-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,13 +16,13 @@
package org.springframework.boot.test.autoconfigure.data.cassandra;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.cassandra.repository.CassandraRepository;
/**
* Example repository used with {@link DataCassandraTest @DataCassandraTest} tests.
*
* @author Artsiom Yudovin
*/
public interface ExampleRepository extends CrudRepository<Person, String> {
interface ExampleRepository extends CassandraRepository<ExampleEntity, String> {
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2012-2019 the original author or authors.
* Copyright 2012-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -33,8 +33,8 @@ public class ExampleService {
this.cassandraTemplate = cassandraTemplate;
}
public boolean hasRecord(Person person) {
return this.cassandraTemplate.exists(person.getId(), Person.class);
public boolean hasRecord(ExampleEntity entity) {
return this.cassandraTemplate.exists(entity.getId(), ExampleEntity.class);
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2012-2019 the original author or authors.
* Copyright 2012-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,6 +17,7 @@
package org.springframework.boot.test.autoconfigure.json.app;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration;
import org.springframework.boot.test.autoconfigure.json.JsonTest;
/**
@@ -25,7 +26,7 @@ import org.springframework.boot.test.autoconfigure.json.JsonTest;
*
* @author Phillip Webb
*/
@SpringBootApplication
@SpringBootApplication(exclude = CassandraAutoConfiguration.class)
public class ExampleJsonApplication {
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2012-2019 the original author or authors.
* Copyright 2012-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@ package org.springframework.boot.test.autoconfigure.override;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration;
import org.springframework.boot.test.autoconfigure.OverrideAutoConfiguration;
/**
@@ -28,7 +29,7 @@ import org.springframework.boot.test.autoconfigure.OverrideAutoConfiguration;
* @author Andy Wilkinson
*/
@SpringBootConfiguration
@EnableAutoConfiguration
@EnableAutoConfiguration(exclude = CassandraAutoConfiguration.class)
public class OverrideAutoConfigurationSpringBootApplication {
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2012-2019 the original author or authors.
* Copyright 2012-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@ package org.springframework.boot.test.autoconfigure.restdocs;
import org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
/**
@@ -25,7 +26,8 @@ import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfi
*
* @author Andy Wilkinson
*/
@SpringBootApplication(exclude = { SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class })
@SpringBootApplication(exclude = { CassandraAutoConfiguration.class, SecurityAutoConfiguration.class,
ManagementWebSecurityAutoConfiguration.class })
public class RestDocsTestApplication {
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2012-2019 the original author or authors.
* Copyright 2012-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@ import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Configuration;
@@ -57,7 +58,7 @@ class AutoConfigureWebClientWithRestTemplateIntegrationTests {
}
@Configuration(proxyBeanMethods = false)
@EnableAutoConfiguration
@EnableAutoConfiguration(exclude = CassandraAutoConfiguration.class)
static class Config {
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2012-2019 the original author or authors.
* Copyright 2012-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,6 +17,7 @@
package org.springframework.boot.test.autoconfigure.web.reactive.webclient;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration;
import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest;
/**
@@ -25,7 +26,7 @@ import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest;
*
* @author Stephane Nicoll
*/
@SpringBootApplication
@SpringBootApplication(exclude = CassandraAutoConfiguration.class)
public class ExampleWebFluxApplication {
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2012-2019 the original author or authors.
* Copyright 2012-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,6 +17,7 @@
package org.springframework.boot.test.autoconfigure.web.servlet.mockmvc;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
/**
@@ -25,7 +26,7 @@ import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
*
* @author Phillip Webb
*/
@SpringBootApplication
@SpringBootApplication(exclude = CassandraAutoConfiguration.class)
public class ExampleWebMvcApplication {
}