1. Обзор
Как правило, мы используем систему автоматической настройки Spring, такую как @SpringBootTest
, для тестирования приложений Spring Boot. Но это приводит к большому количеству импорта автоматически настроенных компонентов.
Однако всегда полезно загружать только необходимые части для тестирования части приложения. По этой причине Spring Boot предоставляет множество аннотаций для тестирования слайсов. Прежде всего, каждая из этих аннотаций Spring загружает очень ограниченный набор автоматически настраиваемых компонентов, необходимых для определенного уровня.
В этом руководстве мы сосредоточимся на тестировании фрагмента базы данных Cassandra приложения Spring Boot, чтобы узнать об аннотации @DataCassandraTest
, предоставляемой Spring.
Кроме того, мы рассмотрим небольшое приложение Spring Boot на основе Cassandra в действии.
И, если вы используете Cassandra в производственной среде, вы определенно можете упростить запуск и обслуживание собственного сервера и вместо этого использовать базу данных Astra , которая представляет собой облачную базу данных, построенную на Apache Cassandra.
2. Зависимости Maven
Чтобы использовать аннотацию @DataCassandraTest
в нашем приложении Cassandra Spring Boot, мы должны добавить зависимость spring-boot-starter-test
:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.5.3</version>
<scope>test</scope>
</dependency>
Spring -boot-test-autoconfigure
Spring является частью библиотеки spring-boot-starter-test
и содержит множество компонентов автоматической настройки для тестирования различных частей приложения. `` ``
Как правило, эта тестовая аннотация имеет шаблон @XXXTest
.
Аннотация @DataCassandraTest
импортирует следующие компоненты автоконфигурации данных Spring:
КэшАвтоконфигурация
CassandraAutoConfiguration
CassandraDataAutoConfiguration
CassandraReactiveDataAutoConfiguration
CassandraReactiveRepositoriesAutoConfiguration
CassandraRepositoriesAutoConfiguration
3. Пример приложения Cassandra Spring Boot
Чтобы проиллюстрировать эти концепции, у нас есть простое веб-приложение Spring Boot, основным доменом которого является инвентаризация транспортных средств.
Для простоты это приложение обеспечивает базовые операции CRUD
с данными инвентаризации.
3.1. Кассандра Мейвен Зависимость
Spring предоставляет модуль spring-boot-starter-data-cassandra
для данных Cassandra: ``
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-cassandra</artifactId>
<version>2.5.3</version>
</dependency>
Нам также нужна зависимость от ядра java-драйвера
Datastax Cassandra, чтобы обеспечить подключение к кластеру и выполнение запросов: ``
<dependency>
<groupId>com.datastax.oss</groupId>
<artifactId>java-driver-core</artifactId>
<version>4.13.0</version>
</dependency>
3.2. Конфигурация Кассандры
Здесь наш класс CassandraConfig
расширяет Spring AbstractCassandraConfiguration
, который является базовым классом для конфигурации Spring Data Cassandra.
Этот класс Spring используется для настройки клиентского приложения Cassandra с CqlSession
для подключения к кластеру Cassandra.
Кроме того, мы можем настроить имя пространства ключей и хост кластера:
@Configuration
public class CassandraConfig extends AbstractCassandraConfiguration {
@Override
protected String getKeyspaceName() {
return "inventory";
}
@Override
public String getContactPoints() {
return "localhost";
}
@Override
protected String getLocalDataCenter() {
return "datacenter1";
}
}
4. Модель данных
Следующий язык запросов Cassandra ( CQL
) создает пространство ключей Cassandra по инвентаризации
имен : `` ``
CREATE KEYSPACE inventory
WITH replication = {
'class' : 'NetworkTopologyStrategy',
'datacenter1' : 3
};
И этот CQL
создает таблицу Cassandra по названию транспортных средств
в ключевом пространстве инвентаря
: ``
use inventory;
CREATE TABLE vehicles (
vin text PRIMARY KEY,
year int,
make varchar,
model varchar
);
5. Использование @DataCassandraTest
****
Давайте посмотрим, как мы можем использовать @DataCassandraTest
в модульных тестах для тестирования уровня данных приложения.
** Аннотация @DataCassandraTest
** импортирует необходимые модули автоматической настройки Cassandra, включая сканирование компонентов @Table
и @Repository
. В результате это позволяет @Autowire
класс Repository
.
Однако он не сканирует и не импортирует обычные bean-компоненты @Component
и @ConfigurationProperties
.
Кроме того, в JUnit 4 эту аннотацию следует использовать в сочетании с @RunWith(SpringRunner.class)
.
5.1. Класс интеграционного теста
Вот класс InventoryServiceIntegrationTest с аннотацией
@DataCassandraTest
и репозиторием @Autowired:
@RunWith(SpringRunner.class)
@DataCassandraTest
@Import(CassandraConfig.class)
public class InventoryServiceIntegrationTest {
@Autowired
private InventoryRepository repository;
@Test
public void givenVehiclesInDBInitially_whenRetrieved_thenReturnAllVehiclesFromDB() {
List<Vehicle> vehicles = repository.findAllVehicles();
assertThat(vehicles).isNotNull();
assertThat(vehicles).isNotEmpty();
}
}
Мы также добавили простой метод тестирования выше.
Чтобы упростить выполнение этого теста, мы будем использовать тестовый контейнер DockerCompose, который устанавливает трехузловой кластер Cassandra:
public class InventoryServiceLiveTest {
// ...
public static DockerComposeContainer container =
new DockerComposeContainer(new File("src/test/resources/compose-test.yml"));
@BeforeAll
static void beforeAll() {
container.start();
}
@AfterAll
static void afterAll() {
container.stop();
}
}
Вы можете найти файл compose-test.yml в проекте GitHub здесь .
5.2. Класс репозитория
Пример класса репозитория InventoryRepository
определяет несколько пользовательских методов JPA :
@Repository
public interface InventoryRepository extends CrudRepository<Vehicle, String> {
@Query("select * from vehicles")
List<Vehicle> findAllVehicles();
Optional<Vehicle> findByVin(@Param("vin") String vin);
void deleteByVin(String vin);
}
Мы также определим уровень согласованности «local-quorum», который подразумевает строгую согласованность, добавив это свойство в файл application.yml :
spring:
data:
cassandra:
request:
consistency: local-quorum
6. Другие аннотации @DataXXXTest
****
Ниже приведены некоторые другие подобные аннотации для тестирования уровня базы данных любого приложения:
@DataJpaTest
импортирует репозиторииJPA
, классы@Entity и т. д.
``@DataJdbcTest
импортирует репозитории Spring Data, JdbcTemplate и т. д.@DataMongoTest
импортирует репозитории Spring Data MongoDB, шаблоны Mongo и классы@Document.
@DataNeo4jTest
импортирует репозитории Spring Data Neo4j, классы@Node
@DataRedisTest
импортирует репозитории Spring Data Redis,@RedisHash
Пожалуйста, посетите документацию Spring для получения дополнительных тестовых аннотаций и подробной информации.
7. Заключение
В этой статье мы узнали, как аннотация @DataCassandraTest
загружает несколько компонентов автоконфигурации Spring Data Cassandra. В результате он позволяет избежать загрузки многих нежелательных модулей контекста Spring.
Как всегда, полный исходный код доступен на GitHub .