知識庫 / Spring / Spring Boot RSS 訂閱

使用 Spring Boot 和 @DataCassandraTest 測試 NoSQL 查詢

Data,NoSQL,Spring Boot
HongKong
11
12:28 PM · Dec 06 ,2025

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-quorum

6. 其他 標註

以下是一些用於測試應用程序數據庫層的其他類似標註:

  • 導入 JPA 倉庫、 類等。
  • 導入 Spring Data 倉庫、JdbcTemplate 等。
  • 導入 Spring Data MongoDB 倉庫、Mongo 模板和 類。
  • 導入 Spring Data Neo4j 倉庫、 類。
  • 導入 Spring Data Redis 倉庫、

請訪問Spring 文檔以獲取更多測試標註和詳細信息。

7. 結論

在本文中,我們學習瞭如何使用 <i @DataCassandraTest</i> 註解加載幾個 Spring Data Cassandra 自定義配置組件。 這樣可以避免加載許多不必要的 Spring 上下文模塊。

如往常一樣,完整的源代碼可在 GitHub 上獲取

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.