Как JUnit тестирует аннотацию @PreAuthorize и ее spring EL, заданную контроллером spring MVC?
Я определил этот метод в моем контроллере Spring MVC:
@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) {
....
}
потом в моей JUnit-тест, я бы хотел, чтобы вызвать этот метод и убедиться, что условие предварительного блокирования средств проверена. Но когда я устанавливаю участника пользователя в моем тесте JUnit с плохой учетной записью, ошибки нет, и метод завершается. Кажется, аннотацию обходят стороной.
Но когда я называю этот метод в обычном порядке (не тестирование), авторизацию проверяется.
Если это возможно, как проверить эта аннотация в тесте junit и как поймать исключение, если оно бросает его ?
спасибо,
Николя!--2-->
1 ответов
поскольку вы хотите протестировать функции, реализованные через Spring AOP, вам нужно использовать Spring TestContext framework для запуска тестов в контексте приложения.
затем вы создаете базовый тест с минимальной конфигурацией безопасности:
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 = "..." />
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));
}
}
теперь вы можете использовать его в ваших тестах:
@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(...);
}
}