Java @在并行上下文中使用mockuser

Java @在并行上下文中使用mockuser,java,spring-boot,junit,spring-security,spring-test,Java,Spring Boot,Junit,Spring Security,Spring Test,下面的代码只是我想要实现的一个简化版本 我正在使用@和mockuser(用户名=”jane@no-domain.com”,authorities={“ROLE_ADMIN”})在我的测试中模拟用户 @RunWith(SpringRunner.class) @SpringBootTest @EnableAsync @WithMockUser(username = "jane@no-domain.com", authorities = {"ROLE_ADMIN"

下面的代码只是我想要实现的一个简化版本

我正在使用
@和mockuser(用户名=”jane@no-domain.com”,authorities={“ROLE_ADMIN”})
在我的测试中模拟用户

@RunWith(SpringRunner.class)
@SpringBootTest
@EnableAsync
@WithMockUser(username = "jane@no-domain.com", authorities = {"ROLE_ADMIN"})
public class NonTest {

    @Test
    public void test() {
        IntStream.range(1, 10)
            .parallel() // Comment this and it will work
            .forEach(value -> {
                getUser(value);
            });
    }

    public void getUser(int value) {
        System.out.println(value + ": " + ((User) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getUsername());
    }

}
当我用注释掉的
.parallel()
执行上述代码时,它会正常工作并按预期打印出以下内容:

1: jane@no-domain.com
2: jane@no-domain.com
3: jane@no-domain.com
4: jane@no-domain.com
5: jane@no-domain.com
6: jane@no-domain.com
7: jane@no-domain.com
8: jane@no-domain.com
9: jane@no-domain.com
。。。但是,当我添加
.parallel()
时,它会抛出一个
NullPointerException
,因为不知何故模拟用户不存在

当我使用
ExecutorService
或任何类型的线程时,它的行为方式相同

那么,如何并行执行该方法呢?

使用
.parallel()。从在线视频流:

当流并行执行时,Java运行时对 流成多个子流。聚合操作在和上迭代 并行处理这些子流,然后合并结果

因此,您需要使子线程从本地线程继承
SecurityContextHolder
,为此,您可以使用
@PostConstruct
,如下所示(请参阅更多信息):

输出

6: jane@no-domain.com
7: jane@no-domain.com
1: jane@no-domain.com
2: jane@no-domain.com
3: jane@no-domain.com
9: jane@no-domain.com
4: jane@no-domain.com
8: jane@no-domain.com
5: jane@no-domain.com

谢谢成功了。我也学到了一些东西。我不知道子线程应该从本地线程继承
SecurityContext
6: jane@no-domain.com
7: jane@no-domain.com
1: jane@no-domain.com
2: jane@no-domain.com
3: jane@no-domain.com
9: jane@no-domain.com
4: jane@no-domain.com
8: jane@no-domain.com
5: jane@no-domain.com