2017-02-07 6 views
3

Я тестирую свои контроллеры 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 для вызова метода & отладки.

Что мне не хватает?

ответ

2

Вы должны включить весеннюю безопасность для тестирования при строительстве mockMvc.

Весной 4 это так:

mockMvc = MockMvcBuilders.webAppContextSetup(context) 
         .apply(springSecurity()) 
         .build(); 

Весной 3 это так:

@Autowired 
private Filter springSecurityFilterChain; 
... 
mockMvc = MockMvcBuilders.webAppContextSetup(context) 
         .addFilters(springSecurityFilterChain) 
         .build(); 

Для получения более подробной информации см:

+0

Благодарим за это. Основная проблема, с которой я столкнулся сейчас, заключается в том, что использование «webAppContextSetup», а не «standaloneSetup» требует включения моего контроллера в applicationContext с помощью компонентного сканирования. Однако для этого требуется, чтобы я также включил все классы, которые были автоматически включены в мой контроллер, хотя они все издеваются над тестом, и сами реализации не используются. В моей настройке явно что-то не так, но я не могу понять, что. – DGoodman

+1

Посмотрите 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) который может использоваться для издевательства автообновленных бобов в вашем контроллере. –

Смежные вопросы