Я пытался выяснить, как unit test, если мои URL-адреса моих контроллеров должным образом защищены. На всякий случай кто-то меняет ситуацию и случайно удаляет настройки безопасности.
Мой метод контроллера выглядит следующим образом:
@RequestMapping("/api/v1/resource/test") 
@Secured("ROLE_USER")
public @ResonseBody String test() {
    return "test";
}
Я создал WebTestEnvironment следующим образом:
import javax.annotation.Resource;
import javax.naming.NamingException;
import javax.sql.DataSource;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.web.FilterChainProxy;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration({ 
        "file:src/main/webapp/WEB-INF/spring/security.xml",
        "file:src/main/webapp/WEB-INF/spring/applicationContext.xml",
        "file:src/main/webapp/WEB-INF/spring/servlet-context.xml" })
public class WebappTestEnvironment2 {
    @Resource
    private FilterChainProxy springSecurityFilterChain;
    @Autowired
    @Qualifier("databaseUserService")
    protected UserDetailsService userDetailsService;
    @Autowired
    private WebApplicationContext wac;
    @Autowired
    protected DataSource dataSource;
    protected MockMvc mockMvc;
    protected final Logger logger = LoggerFactory.getLogger(this.getClass());
    protected UsernamePasswordAuthenticationToken getPrincipal(String username) {
        UserDetails user = this.userDetailsService.loadUserByUsername(username);
        UsernamePasswordAuthenticationToken authentication = 
                new UsernamePasswordAuthenticationToken(
                        user, 
                        user.getPassword(), 
                        user.getAuthorities());
        return authentication;
    }
    @Before
    public void setupMockMvc() throws NamingException {
        // setup mock MVC
        this.mockMvc = MockMvcBuilders
                .webAppContextSetup(this.wac)
                .addFilters(this.springSecurityFilterChain)
                .build();
    }
}
В моем фактическом тесте я попытался сделать что-то вроде этого:
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import org.junit.Test;
import org.springframework.mock.web.MockHttpSession;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.context.HttpSessionSecurityContextRepository;
import eu.ubicon.webapp.test.WebappTestEnvironment;
public class CopyOfClaimTest extends WebappTestEnvironment {
    @Test
    public void signedIn() throws Exception {
        UsernamePasswordAuthenticationToken principal = 
                this.getPrincipal("test1");
        SecurityContextHolder.getContext().setAuthentication(principal);        
        super.mockMvc
            .perform(
                    get("/api/v1/resource/test")
//                    .principal(principal)
                    .session(session))
            .andExpect(status().isOk());
    }
}
Я выбрал это здесь:
- <а href= "http://java.dzone.com/articles/spring-test-mvc-junit-testing" rel= "noreferrer" > http://java.dzone.com/articles/spring-test-mvc-junit-testing здесь:
 - <а href= "http://techdive.in/solutions/how-mock-securitycontextholder-perfrom-junit-tests-spring-controller" rel= "noreferrer" > http://techdive.in/solutions/how-mock-securitycontextholder-perfrom-junit-tests-spring-controller или здесь:
 - <а href= "/info/114826/how-to-junit-tests-a-preauthorize-annotation-and-its-spring-el-specified-by-a-spring-mvc-controller" > Как JUnit проверяет аннотацию @PreAuthorize и ее spring EL, указанную с помощью spring MVC Controller?
 
Однако, если вы посмотрите внимательно, это помогает только при отправке фактических запросов на URL-адреса, но только при тестировании служб на уровне функций. В моем случае было исключено исключение "access denied":
org.springframework.security.access.AccessDeniedException: Access is denied
    at org.springframework.security.access.vote.AffirmativeBased.decide(AffirmativeBased.java:83) ~[spring-security-core-3.1.3.RELEASE.jar:3.1.3.RELEASE]
    at org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:206) ~[spring-security-core-3.1.3.RELEASE.jar:3.1.3.RELEASE]
    at org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:60) ~[spring-security-core-3.1.3.RELEASE.jar:3.1.3.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) ~[spring-aop-3.2.1.RELEASE.jar:3.2.1.RELEASE]
        ...
Следует отметить следующие два сообщения журнала, в основном говорящие, что ни один пользователь не был аутентифицирован, указав, что установка Principal не работает или что она была перезаписана.
14:20:34.454 [main] DEBUG o.s.s.a.i.a.MethodSecurityInterceptor - Secure object: ReflectiveMethodInvocation: public java.util.List test.TestController.test(); target is of class [test.TestController]; Attributes: [ROLE_USER]
14:20:34.454 [main] DEBUG o.s.s.a.i.a.MethodSecurityInterceptor - Previously Authenticated: org.sprin[email protected]9055e4a6: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.sprin[email protected]957e: RemoteIpAddress: 127.0.0.1; SessionId: null; Granted Authorities: ROLE_ANONYMOUS