Метод тестирования сервиса, который имеет @PreAuthorize с JUnit - PullRequest
0 голосов
/ 29 января 2019

В Spring Boot 1.4.1 я хочу выполнить модульное тестирование (не интеграционное тестирование) с помощью сервисного метода, доступ к которому ограничен @ PreAuthorize.

Проблема в том, что @PreAuthorize, похоже, небыть проверенным при запуске тестового соло из Eclipse (пока не пытайтесь с mvn test).

Тогда, если мне удастся чудесным образом правильно запустить тест, я попытаюсь работать с интерфейсом StudyService, а не сimpl.

Вот мой тестовый класс:

@RunWith(MockitoJUnitRunner.class)
public class TestMethodSecurity {

    private static final Long STUDY_ID = 1L;

    @Mock
    private StudyRepository studyRepository;

    @InjectMocks
    private StudyServiceImpl studyService;


    @Before
    public void setup() {
        given(studyRepository.findOne(STUDY_ID)).willReturn(ModelsUtil.createStudy());
    }


    @Test
    public void findByIdWithoutAccessRightTest() {
        Study study = studyService.findById(STUDY_ID);
    }
}

Это сервис:

@Service
public class StudyServiceImpl implements StudyService {


    @Autowired
    private StudyRepository studyRepository;


    @Override
    @PreAuthorize("hasAnyRole('DOES NOT EVENT CHECK SYNTAX")
    public Study findById(final Long id) {
        return studyRepository.findOne(id);
    }

}

Тест пройден успешно, что не удалось.

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Аннотируйте свой тестовый класс с помощью

@RunWith(SpringRunner.class)
@ContextConfiguration

Ваш метод должен выглядеть следующим образом

@Test(expected = AccessDeniedException.class)
@WithAnonymousUser
@Test
    public void findByIdWithoutAccessRightTest() {
        Study study = studyService.findById(STUDY_ID);
    }

Вы не можете проверить безопасность без загрузки хотя бы контекста безопасности.

Возможно, вы захотите взглянуть на этот пример:

public ApplicationUser getApplicationUser() {
    ApplicationUser applicationUser = (ApplicationUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    return applicationUser;
}

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.mock;
import org.mockito.MockitoAnnotations;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import com.arpit.security.user.ApplicationUser;

public class BaseTest {

    @Before
    public void setupMock() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void mockApplicationUser() {
        ApplicationUser applicationUser = mock(ApplicationUser.class);
        Authentication authentication = mock(Authentication.class);
        SecurityContext securityContext = mock(SecurityContext.class);
        when(securityContext.getAuthentication()).thenReturn(authentication);
        SecurityContextHolder.setContext(securityContext);
        when(SecurityContextHolder.getContext().getAuthentication().getPrincipal()).thenReturn(applicationUser);
    }

}

Взято из: https://www.javacodegeeks.com/2017/05/mocking-spring-security-context-unit-testing.html

И я полагаю, что в вашем сервисном методе специально есть синтаксические ошибки?(отсутствует скобка и неверные кавычки?)

0 голосов
/ 29 января 2019

Если вы хотите протестировать аннотации Spring Security, вам необходимо использовать SpringRunner, который создаст Spring Context и внедрит код Spring Security в прокси-класс.

Как протестировать Spring Security вы можете найти здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...