即使使用@DirtiesContext,将 SecurityContextHolder.setContext(...) 设置为模拟也会进行不同的测试 类

Setting SecurityContextHolder.setContext(...) to a mock carries across to different test classes even with @DirtiesContext

在我的一个测试 classes 中,我使用:

//Make a security context
SecurityContext securityContext = mock( SecurityContext.class );
SecurityContextHolder.setContext( securityContext );

然后我在上面设置了一些东西。

在另一个测试 class 中,由于该模拟仍然存在,我失败了。我在所有 class 测试中添加了 @DirtiesContext,但它仍然发生。当我在第二个 class 中检查安全上下文的 class 时,它说这是一个模拟。

如何正确重置 class 之间的所有内容?

第一个class是运行为:

@RunWith( SpringJUnit4ClassRunner.class )
@SpringBootTest(
    webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
)
@DirtiesContext

第二个是:

@RunWith( SpringJUnit4ClassRunner.class )
@DirtiesContext

"context" 这个词让你感到困惑。

这是两个截然不同的"contexts"。

@DirtiesContext与考试有关ApplicationContext;而 SecurityContext 是 Spring 安全的一部分,与 ApplicationContext.

无关

因此,如果您在 Spring 安全性 SecurityContextHolder 中设置了 SecurityContext,则您的工作是在测试完成后将其删除。

后者需要您手动完成。如果您希望 Spring 安全的测试支持来处理所有事情,您可能会更喜欢 @WithMockUserspring-security-test 中的相关测试支持。