Nic*_*ico 10 junit controller spring-mvc spring-security spring-el
我在Spring MVC Controller中定义了这个方法:
@RequestMapping(value = "{id}/content", method=RequestMethod.POST)
@PreAuthorize("principal.user.userAccount instanceof T(com.anonym.model.identity.PedagoAccount) AND principal.user.userAccount.userId == #object.pedago.userId AND #form.id == #object.id")
public String modifyContent(@PathVariable("id") Project object, @Valid @ModelAttribute("form") ProjectContentForm form) {
....
}
Run Code Online (Sandbox Code Playgroud)
然后在我的JUnit测试中,我想调用此方法并确保验证PreAuthorize条件.但是当我在JUnit测试中使用错误帐户设置用户主体时,没有错误,方法完成.似乎绕过了注释.
但是当我以正常方式调用此方法(而不是测试)时,将验证PreAuthorize.
如果可能的话,如何在junit测试中测试这个注释以及如果它抛出一个异常如何捕获它?
谢谢,
尼古拉斯
axt*_*avt 15
由于您要测试通过Spring AOP实现的功能,因此您需要使用Spring TestContext框架来针对应用程序上下文运行测试.
然后使用最少的安全配置创建基本测试:
abstract-security-test.xml:
<security:authentication-manager alias="authenticationManager">
<security:authentication-provider user-service-ref = "userService" />
</security:authentication-manager>
<security:global-method-security pre-post-annotations="enabled" />
<bean id = "userService" class = "..." />
Run Code Online (Sandbox Code Playgroud)
AbstractSecurityTest.java:
@ContextConfiguration("abstract-security-test.xml")
abstract public class AbstractSecurityTest {
@Autowired
private AuthenticationManager am;
@After
public void clear() {
SecurityContextHolder.clearContext();
}
protected void login(String name, String password) {
Authentication auth = new UsernamePasswordAuthenticationToken(name, password);
SecurityContextHolder.getContext().setAuthentication(am.authenticate(auth));
}
}
Run Code Online (Sandbox Code Playgroud)
现在您可以在测试中使用它:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(...)
public class CreatePostControllerSecurityTest extends AbstractSecurityTest {
...
@Test
@ExpectedException(AuthenticationCredentialsNotFoundException.class)
public void testNoAuth() {
controller.modifyContent(...);
}
@Test
@ExpectedException(AccessDeniedException.class)
public void testAccessDenied() {
login("userWithoutAccessRight", "...");
controller.modifyContent(...);
}
@Test
public void testAuthOK() {
login("userWithAccessRight", "...");
controller.modifyContent(...);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11487 次 |
| 最近记录: |