Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 测试时忽略弹簧控制器上的预授权注释_Java_Spring_Spring Security_Mockito_Junit4 - Fatal编程技术网

Java 测试时忽略弹簧控制器上的预授权注释

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测试失败,因为我没有提

我正在使用JUnit、Mockito和SpringTest测试我的SpringMVC控制器。不幸的是,测试忽略了控制器方法上的@PreAuthorize注释,我无法解决这个问题。下面是关键的代码片段,不过为了保持简短,我已经从MyController的依赖项中删除了模拟响应的无关逻辑。我使用的是Spring3.2和JUnit4,我通过Maven和Eclipse直接运行测试(RunAs->JUnit测试)

现在,我希望getAccounts\u ReturnsOkStatus测试失败,因为我没有提供任何身份验证,并且/accounts路由映射到的方法使用预身份验证注释进行了注释,但是调用了该方法并且绕过了预身份验证检查

MyControllerTest.java

applicationContext-test.xml

仅适用于测试配置中指定的用户凭据(在没有任何其他身份验证提供程序的情况下)。此外,我可以确定预验证被忽略了,因为我已经使用SEL调用了一个方法并进行了调试


我缺少什么?

在构建
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
到Mock
MyService
使用
@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();