Java 测试时忽略弹簧控制器上的预授权注释
我正在使用JUnit、Mockito和SpringTest测试我的SpringMVC控制器。不幸的是,测试忽略了控制器方法上的@PreAuthorize注释,我无法解决这个问题。下面是关键的代码片段,不过为了保持简短,我已经从MyController的依赖项中删除了模拟响应的无关逻辑。我使用的是Spring3.2和JUnit4,我通过Maven和Eclipse直接运行测试(RunAs->JUnit测试) 现在,我希望getAccounts\u ReturnsOkStatus测试失败,因为我没有提供任何身份验证,并且/accounts路由映射到的方法使用预身份验证注释进行了注释,但是调用了该方法并且绕过了预身份验证检查 MyControllerTest.java applicationContext-test.xml 仅适用于测试配置中指定的用户凭据(在没有任何其他身份验证提供程序的情况下)。此外,我可以确定预验证被忽略了,因为我已经使用SEL调用了一个方法并进行了调试Java 测试时忽略弹簧控制器上的预授权注释,java,spring,spring-security,mockito,junit4,Java,Spring,Spring Security,Mockito,Junit4,我正在使用JUnit、Mockito和SpringTest测试我的SpringMVC控制器。不幸的是,测试忽略了控制器方法上的@PreAuthorize注释,我无法解决这个问题。下面是关键的代码片段,不过为了保持简短,我已经从MyController的依赖项中删除了模拟响应的无关逻辑。我使用的是Spring3.2和JUnit4,我通过Maven和Eclipse直接运行测试(RunAs->JUnit测试) 现在,我希望getAccounts\u ReturnsOkStatus测试失败,因为我没有提
我缺少什么?在构建
mockMvc
时,必须启用spring安全性进行测试
春天4号是这样的:
mockMvc = MockMvcBuilders.webAppContextSetup(context)
.apply(springSecurity())
.build();
@Autowired
private Filter springSecurityFilterChain;
...
mockMvc = MockMvcBuilders.webAppContextSetup(context)
.addFilters(springSecurityFilterChain)
.build();
在春季3,它是这样的:
mockMvc = MockMvcBuilders.webAppContextSetup(context)
.apply(springSecurity())
.build();
@Autowired
private Filter springSecurityFilterChain;
...
mockMvc = MockMvcBuilders.webAppContextSetup(context)
.addFilters(springSecurityFilterChain)
.build();
有关更多详细信息,请参阅:
MockMvcBuilders.standaloneSetup
获取手动实例化的MyController
(没有Spring,因此没有AOP)。因此,@PreAuthorize
不会被拦截,安全检查将被跳过。因此,您可以@Autowire您的控制器,并将其传递给MockMvcBuilders.standaloneSetup
到MockMyService
使用@MockBean
,以便该服务的每个实例都被替换为Mock。谢谢。我现在遇到的主要问题是,使用“webAppContextSetup”而不是“standaloneSetup”需要使用组件扫描将我的控制器包括在applicationContext中。然而,要做到这一点,我还需要包括所有自动连接到控制器中的类,即使它们在测试中都被模拟,并且实现本身没有被使用。我的设置显然有问题,但我不知道是什么问题。请看。它解释了如何仍然可以使用standaloneSetup
。使用webAppContextSetup
时,请查看可用于在控制器中模拟自动连线bean的@MockBean
()。@RenéScheibe服务层上的注释如何?
mockMvc = MockMvcBuilders.webAppContextSetup(context)
.apply(springSecurity())
.build();
@Autowired
private Filter springSecurityFilterChain;
...
mockMvc = MockMvcBuilders.webAppContextSetup(context)
.addFilters(springSecurityFilterChain)
.build();