解决 Spring Boot + shiro + junit 进行单元测试时报错 No SecurityManager accessible to the calling code 的问题
问题描述
项目使用 Spring Boot 整合 shiro,利用 MockMVC 进行单元测试时,报如下错误:
Cause: org.apache.shiro.UnavailableSecurityManagerException:
No SecurityManager accessible to the calling code,
either bound to the org.apache.shiro.util.ThreadContext or as a vm static singleton.
This is an invalid applation configuration.
原因分析
使用 MockMVC 模拟 HTTP 请求时启动的模拟环境中没有 ShiroFilter,在 ShiroFilter 配置处设置的 SecurityManager 就找不到,找不到 ShiroFilter 的具体原因没有深究。
解决办法
在测试类的 @Before 部分设置 SecurityManager。
解决前
@RunWith(SpringRunner.class)
@SpringBootTest(WebEnviroment = SpringBootTest.WebEnviroment.RANDOM_PORT)
public class ApplicationControllerTest {
@Autowired
private WebApplicationContext webApplicationContext;
private MockMvc mockMvc;
@Before
public void setupMockMvc() {
mockMvc = MockMvcBuilder.webAppContextSetup(webApplicationContext).build();
}
//测试代码。。。
}
解决后
@RunWith(SpringRunner.class)
@SpringBootTest(WebEnviroment = SpringBootTest.WebEnviroment.RANDOM_PORT)
public class ApplicationControllerTest {
@Autowired
private WebApplicationContext webApplicationContext;
private MockMvc mockMvc;
@Before
public void setupMockMvc() {
mockMvc = MockMvcBuilder.webAppContextSetup(webApplicationContext).build();
SecurityUtils.setSecurityManager(webApplicationContext.getBean(SecurityManager.class));
}
//测试代码。。。
}
结语
在项目升级框架的过程中遇到此问题,在此记录下。造成该问题的原因有多种,需要查看异常堆栈信息根据不同的情况采取不同的策略。