当我启动 Spring Boot 应用程序时,我使用此代码将应用程序设置为忽略租户:
CommonContext.setTenantIgnore(true);
这个效果很好。然后我写了一个JUnit测试用例,我还需要使用
CommonContext.setIgnoreTenant(true)
忽略租户,我已经尝试过这样的:
@BeforeAll
public static void before() {
CommonContextHolder.setTenantIgnore(true);
}
@BeforeEach
void init() {
CommonContextHolder.setTenantIgnore(true);
}
@Before
public void setup() {
CommonContextHolder.setTenantIgnore(true);
}
也尝试过这样的:
@SpringJUnitConfig
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class TenantIgnore {
@BeforeAll
public static void setUp() {
CommonContextHolder.setTenantIgnore(true);
}
}
也不起作用。在开始所有单元测试之前我应该做什么来设置租户忽略?我认为它应该在 JUnit 应用程序启动之前(或在 spring 容器启动之前),在所有测试类之前。
我看到的基本问题是,您在静态上下文中使用 CommonContextHolder 和 CommonContext,而 Spring 并不是为“处理”静态上下文而设计的......简单地说。
您所写的 Spring 上下文在单元测试中也不存在(此处为 junit5)。
如果您想在测试用例中利用 Spring 上下文,您应该使用 @SpringBootTest 调用测试。这还将把所有带有 Spring 注解的 Bean 加载到测试上下文中。只有这样您才能在测试设置方法中访问这些类。 但它们不可能是静态的。为了简单起见,请避免在 Spring Boot 应用程序中使用静态类。
如果您希望租户标志在运行时、测试或生产期间可编辑,则需要创建该类的实例。 Spring Boot 会做到这一点。只需在类级别添加 @Component 注释即可。将 @SpringbootTest 注解添加到您的测试中,删除其他注解。
您可以在设置方法和运行时获取设置的租户上下文。提供 Getter 和 Setter。
在单元测试环境中提供可用上下文的另一种方法是像 Mockito 这样的 Mock。
你必须知道单元测试只是为了测试简单、小型和专用的代码部分。 Spring 上下文通常不属于单元测试上下文。所以你必须嘲笑它。