我使用设置了一个春季启动应用程序
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
?