代码之家  ›  专栏  ›  技术社区  ›  Kevin

使用TenantIdentifierResolver为春季启动应用程序运行DataJpaTest

  •  0
  • Kevin  · 技术社区  · 3 年前

    我使用设置了一个春季启动应用程序 CurrentTenantIdentifierResolver 来管理tenantId。我想使用测试该应用程序的存储库层 @DataJpaTest 。我的测试设置看起来像:

    @DataJpaTest(
        includeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = TenantIdentifierResolver.class)
    )
    public class VendorRepositoryTest implements BaseTest {
    
      @Autowired
      private VendorRepository vendorRepository;
    
      @Test
      public void testVendorRepository() {
        TenantIdentifierResolver.forceTenantId("123", () -> {
          vendorRepository.save(new Vendor()
              .setName("name1");
        });
    
        TenantIdentifierResolver.forceTenantId("456", () -> {
          vendorRepository.save(new Vendor()
              .setName("name2"));
    
          Page<Vendor> a = vendorRepository.findAll(Pageable.ofSize(10));
          System.out.println(a);
        });
      }
    }
    

    此测试创建了两个不同的供应商 @TenantId s存储库了解并尊重 TenantId 设置在 当前租户标识符解析程序 .

    但是,在此测试场景中,VendorRepository不尊重TenantId,并返回两个Vendor。我知道 TenantIdentifierResolver 正在通过断点作为测试运行的一部分进行实例化,但存储库不会调用它来在保存期间提供tenantId。数据库行的tenantId为空。

    如果我切换 @数据JpaTest 对于 @SpringBootTest ,一切正常,租户受到尊重。

    有什么方法可以让我得到正确的行为吗 @数据JpaTest 并避免通过切换到来加载完整的应用程序上下文 @SpringBootTest ?

    0 回复  |  直到 3 年前