【问题标题】:How to set tenant context in integration testing in a multi-tenant spring boot application如何在多租户 spring boot 应用程序的集成测试中设置租户上下文
【发布时间】:2023-01-25 15:20:34
【问题描述】:

我必须为多租户(遵循每个实体每个模式共享数据库方法)Spring Boot 应用程序编写集成测试。我在 article 之后实施了解决方案,另外我实施了 HandlerInterceptor 以从 HTTP 标头中提取租户 ID。我通过邮递员测试了所有端点,它们按预期工作。调试后我发现在集成测试中请求没有通过HandlerInterceptor

我已经使用 MockMvc 中的 header("X-TenantID", "test_tenant") 方法添加了租户 ID 标头,但无助于在应用程序中设置当前租户上下文。如何在这些集成测试方法中设置来自 HTTP 标头的租户 ID?

【问题讨论】:

    标签: spring-boot integration-testing spring-test


    【解决方案1】:

    为了在集成测试时在HTTP header 中设置租户ID,可以使用Spring Test 提供的RequestPostProcessor 接口。您可以创建此接口的自定义实现,以在将请求发送到服务器之前将租户 ID 标头添加到请求中。

    以下是如何执行此操作的示例:

    复制代码 公共类 TenantHeaderRequestPostProcessor 实现 RequestPostProcessor {

    private final String tenantId;
    
    public TenantHeaderRequestPostProcessor(String tenantId) {
        this.tenantId = tenantId;
    }
    
    @Override
    public MockHttpServletRequest postProcessRequest(MockHttpServletRequest request) {
        request.addHeader("X-TenantID", tenantId);
        return request;
    }
    

    } 然后,您可以通过调用 MockMvcRequestBuilders 上的 with 方法在集成测试中使用此 RequestPostProcessor:

    复制代码 mockMvc.perform(get("/myendpoint").with(new TenantHeaderRequestPostProcessor("test_tenant")));

    这样,您将在执行集成测试时在标头中设置 tenantId。

    【讨论】:

      最近更新 更多