You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在运行JUnit测试用例时自动化Keycloak部署配置?

JUnit测试中Keycloak自动化部署的简便实现方案

首选方案:Testcontainers + Keycloak模块

Testcontainers是测试场景下的容器化工具,能完美实现测试前自动启动Keycloak容器、导入预配置的Realm JSON、测试完成后自动销毁容器的全流程,完全替代手动操作。

1. 添加依赖

在项目的依赖管理文件中加入Testcontainers相关依赖:

<!-- Maven 示例 -->
<dependency>
    <groupId>org.testcontainers</groupId>
    <artifactId>keycloak</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.testcontainers</groupId>
    <artifactId>junit-jupiter</artifactId>
    <scope>test</scope>
</dependency>

2. 编写测试基类

创建一个通用测试基类,统一管理Keycloak容器的生命周期:

import org.junit.jupiter.api.TestInstance;
import org.testcontainers.containers.KeycloakContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;

@Testcontainers
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public abstract class KeycloakTestBase {

    @Container
    private static final KeycloakContainer KEYCLOAK_CONTAINER = new KeycloakContainer("quay.io/keycloak/keycloak:24.0.1")
            .withRealmImportFile("test-realm.json") // 配置文件放在src/test/resources下
            .withAdminUsername("test-admin")
            .withAdminPassword("test-pass");

    // 启动Keycloak并注入地址到Spring Boot配置
    void setupKeycloak() {
        System.setProperty("keycloak.auth-server-url", KEYCLOAK_CONTAINER.getAuthServerUrl());
    }

    // 直接用容器提供的方法获取令牌
    protected String getTestToken(String username, String password, String clientId) {
        return KEYCLOAK_CONTAINER.getAccessToken(username, password, clientId);
    }
}

3. 编写业务测试用例

你的测试类只需继承基类,专注于业务逻辑测试即可:

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class UserServiceTest extends KeycloakTestBase {

    @Test
    void testAuthenticatedApi() {
        // 获取测试令牌
        String token = getTestToken("test-user", "test-user-pass", "test-client");
        // 携带令牌调用Spring Boot接口并验证结果
    }
}

备选方案:嵌入式Keycloak(无Docker环境适用)

如果测试环境无法使用Docker,可以用keycloak-test-helper启动嵌入式Keycloak,配置稍复杂但无需容器:

<!-- 添加依赖 -->
<dependency>
    <groupId>com.github.dasniko</groupId>
    <artifactId>keycloak-testcontainers-extension</artifactId>
    <version>2.3.0</version>
    <scope>test</scope>
</dependency>
import com.github.dasniko.testcontainers.keycloak.KeycloakContainer;
import org.junit.jupiter.api.BeforeAll;

public class EmbeddedKeycloakTest {

    private static KeycloakContainer keycloak;

    @BeforeAll
    static void initKeycloak() {
        keycloak = new KeycloakContainer()
                .withRealmImportFile("test-realm.json")
                .useDefaultPort();
        keycloak.start();
        System.setProperty("keycloak.auth-server-url", keycloak.getAuthServerUrl());
    }

    // 测试方法...
}

关键注意事项

  • 把包含realm、clients、用户配置的JSON文件放在src/test/resources目录下,工具会自动导入。
  • 选择与生产环境一致的Keycloak版本,避免版本差异引发的兼容问题。
  • Spring Boot 3+用户需确保依赖的Keycloak镜像/库版本适配。

内容的提问来源于stack exchange,提问作者Usman Sajid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 23:39:08