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