1. Overview
通常,我們使用 Spring 的自動配置系統,例如 @SpringBootTest,用於測試 Spring Boot 應用程序。但是 這會導致大量的自動配置組件導入。
然而,為了僅加載測試所需的應用程序部分,總是很有幫助。 因此,Spring Boot 提供了許多註解用於切片測試。 無論如何,這些 Spring 註解都加載了特定層級所需的非常有限的自動配置組件。
在本教程中,我們將重點介紹如何測試 Spring Boot 應用程序中的 Cassandra 數據庫切片,以便 學習 @DataCassandraTest 註解,該註解由 Spring 提供。
此外,我們還將查看一個小型基於 Cassandra 的 Spring Boot 應用程序的實際運行情況。
如果您在生產環境中運行 Cassandra,那麼您當然可以擺脱運行和維護您自己的服務器的複雜性,並使用 Astra 數據庫,該數據庫是 基於 Apache Cassandra 構建的雲數據庫。
2. Maven 依賴
為了在我們的 Cassandra Spring Boot 應用程序中使用 <i id="DataCassandraTest">@DataCassandraTest</i> 註解,我們需要添加 <a href="https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test"><i id="spring-boot-starter-test">spring-boot-starter-test</i></a> 依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.5.3</version>
<scope>test</scope>
</dependency>Spring 的 spring-boot-test-autoconfigure 是 spring-boot-starter-test 庫的一部分,它包含了很多用於測試應用程序不同部分的自動配置組件。
通常,此測試註解的模式是 @XXXTest。
@DataCassandraTest 註解導入了以下 Spring Data 自動配置組件:
- CacheAutoConfiguration
- CassandraAutoConfiguration
- CassandraDataAutoConfiguration
- CassandraReactiveDataAutoConfiguration
- CassandraReactiveRepositoriesAutoConfiguration
- CassandraRepositoriesAutoConfiguration
3. 示例 Cassandra Spring Boot 應用
為了説明這些概念,我們提供了一個簡單的 Spring Boot Web 應用,其主要領域是車輛庫存。
為了簡化,該應用提供基本的 CRUD 操作,對庫存數據進行增刪改查。
3.1. Cassandra Maven 依賴
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>我們還需要依賴 Datastax Cassandra 的 java-driver-core 以啓用集羣連接和請求執行:
<dependency>
<groupId>com.datastax.oss</groupId>
<artifactId>java-driver-core</artifactId>
<version>4.13.0</version>
</dependency>3.2. Cassandra 配置
我們的 <i >CassandraConfig</i> 類繼承了 Spring 的 <i >AbstractCassandraConfiguration</i>,它是 Spring Data Cassandra 配置的基礎類。
該 Spring 類用於配置 Cassandra 客户端應用程序,使用 CqlSession 連接到 Cassandra 集羣。
此外,我們還可以配置 keyspace 名稱和集羣主機:
@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. 數據模型
以下 CQL 創建名為 inventory 的 Cassandra 鍵空間:
CREATE KEYSPACE inventory
WITH replication = {
'class' : 'NetworkTopologyStrategy',
'datacenter1' : 3
};並且這個 CQL 創建了一個名為 vehicles 的 Cassandra 表,位於 inventory 鍵空間中:
use inventory;
CREATE TABLE vehicles (
vin text PRIMARY KEY,
year int,
make varchar,
model varchar
);5. @DataCassandraTest 使用
讓我們看看如何使用 @DataCassandraTest 在單元測試中測試應用程序的數據層。
@DataCassandraTest 註解導入了所需的 Cassandra 自配置模塊,包括掃描 @Table 和 @Repository 組件。 從而使其能夠 @Autowire Repository 類。
但是,它不會掃描和導入常規 @Component 和 @ConfigurationProperties Bean。
此外,在使用 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();
}
}您可以在 GitHub 項目中找到 compose-test.yml 文件。
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);
}我們還將定義一致性級別為“本地共識”,這意味着通過將以下屬性添加到 application.yml 文件中,實現強一致性:
spring:
data:
cassandra:
request:
consistency: local-quorum6. 其他 標註
以下是一些用於測試應用程序數據庫層的其他類似標註:
- 導入 JPA 倉庫、 類等。
- 導入 Spring Data 倉庫、JdbcTemplate 等。
- 導入 Spring Data MongoDB 倉庫、Mongo 模板和 類。
- 導入 Spring Data Neo4j 倉庫、 類。
- 導入 Spring Data Redis 倉庫、。
請訪問Spring 文檔以獲取更多測試標註和詳細信息。
7. 結論
在本文中,我們學習瞭如何使用 <i @DataCassandraTest</i> 註解加載幾個 Spring Data Cassandra 自定義配置組件。 這樣可以避免加載許多不必要的 Spring 上下文模塊。
如往常一樣,完整的源代碼可在 GitHub 上獲取。