即使使用@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 安全的测试支持来处理所有事情,您可能会更喜欢 @WithMockUser
和 spring-security-test
中的相关测试支持。
在我的一个测试 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 安全的测试支持来处理所有事情,您可能会更喜欢 @WithMockUser
和 spring-security-test
中的相关测试支持。