Я тестирую свои контроллеры Spring MVC с использованием JUnit, Mockito & spring-test. К сожалению, тесты игнорируют аннотации @PreAuthorize для моих методов контроллера, и я не смог это решить. Ниже приведены фрагменты кода кода, хотя я удалил ненужную логику для издевательских ответов от зависимостей MyController, чтобы не допустить ее. Я использую Spring 3.2 & JUnit 4, и я запускаю тесты как через Maven, так и непосредственно через Eclipse (Run as -> JUnit test).PreAuthorize аннотации на контроллерах Spring игнорируются при тестировании
Сейчас я ожидал тест getAccounts_ReturnsOkStatus на провал, так как я не предоставил авторизацию и метод, который/счета карты маршрутов на помечаются с предварительно Идентом аннотацией, однако метод в настоящее время вызывается и предварительная проверка проверяется.
MyControllerTest.java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:applicationContext-test.xml" })
public class MyControllerTest {
private MockMvc mockMvc;
@Mock
private MyService myService;
@InjectMocks
private MyController myController;
@Before
public void init() {
MockitoAnnotations.initMocks(this);
mockMvc = MockMvcBuilders.standaloneSetup(myController).build();
}
@Test
public void getAccounts_ReturnsOkStatus() throws Exception {
// Make the GET request, and verify that it returns HttpStatus.OK (200)
mockMvc.perform(MockMvcRequestBuilders.get("/accounts"))
.andExpect(MockMvcResultMatchers.status().isOk());
}
}
ApplicationContext-test.xml
<sec:global-method-security pre-post-annotations="enabled" />
<bean id="applicationContextProvider" class="com.myapp.springsupport.ApplicationContextProvider" />
<sec:authentication-manager alias="authenticationManager">
<sec:authentication-provider>
<sec:user-service>
<sec:user name="test-superuser" password="test-pwd" authorities="ROLE_SUPERUSER" />
</sec:user-service>
</sec:authentication-provider>
</sec:authentication-manager>
MyController.java
@PreAuthorize("isAuthenticated() and hasRole('ROLE_SUPERUSER')")
@RequestMapping(value = "/accounts", method = RequestMethod.GET)
@ResponseBody
public Collection<Account> getAccounts() {
return new ArrayList<Account>();
}
Контекст приложения ApplicationContext-тест, безусловно, используется, так как вручную с помощью аутентификации
Authentication auth = new UsernamePasswordAuthenticationToken(name, password);
SecurityContextHolder.getContext().setAuthentication(am.authenticate(auth));
работает только с учетными данными, указанными в тестовой конфигурации (при отсутствии какой-либо другой аутентификации-провайдера). Кроме того, я могу быть уверен, что pre-auth игнорируется, так как я проверил использование SEL для вызова метода & отладки.
Что мне не хватает?
Благодарим за это. Основная проблема, с которой я столкнулся сейчас, заключается в том, что использование «webAppContextSetup», а не «standaloneSetup» требует включения моего контроллера в applicationContext с помощью компонентного сканирования. Однако для этого требуется, чтобы я также включил все классы, которые были автоматически включены в мой контроллер, хотя они все издеваются над тестом, и сами реализации не используются. В моей настройке явно что-то не так, но я не могу понять, что. – DGoodman
Посмотрите http://docs.spring.io/spring-security/site/docs/current/reference/html/test-mockmvc.html#test-mockmvc-securitycontextholder-rpp. В нем объясняется, как вы все еще можете использовать 'standaloneSetup'.При использовании 'webAppContextSetup' посмотрите' @ MockBean' (http://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/test/mock/mockito/MockBean.html) который может использоваться для издевательства автообновленных бобов в вашем контроллере. –