Как выполнить тестирование весеннего облачного контракта на контроллере с защищенными методами с аннотацией @PreAuthorize ("hasRole ('ADMIN')")? - PullRequest
0 голосов
/ 11 июля 2019

Я пишу тесты Spring Cloud Contract на контроллере MVC, в котором есть методы с аннотацией @PreAuthorize("hasRole('ADMIN')"). Что мне нужно обеспечить для обеспечения безопасности методов? Мне нужно проверить безопасность контроллера. Использование безопасности Oauth2 в проекте. Я младший разработчик (многие вещи, которые я пока не знаю), и было бы здорово, если бы вы предоставили мне расширенные ответы. Благодаря.

Я создал базовый тестовый класс, в котором предоставлен mockMvc в методе setup () с аннотацией @Before.

Базовый тестовый класс имеет вид:

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = AdminController.class)
@ContextConfiguration(classes = {AdminControllerTestConfig.class, TestConfig.class, AdminControllerTestProperty.class})
@ComponentScan(basePackageClasses = AdminController.class)
@TestPropertySource(locations = "/AdminControllerTest.properties")
@AutoConfigureStubRunner(workOffline = true)
public class AdminControllerContractBaseTest {
    //code
}

метод настройки для автоматически сгенерированных контрактных тестов

@Before
    public void setup() {
        Admin admin = createAdminUser();
        when(adminRepository.findOneByCredentialsId(id)).thenReturn(admin);
        RestAssuredMockMvc.standaloneSetup(new AdminController(adminService, credentialsService));
        MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(context)
                .apply(springSecurity())
                .build();
    }

методы испытаний для автоматически сгенерированных классов испытаний

    @Test
    public void shouldFindAdminUserById() {
    }

    @Test
    public void shouldNotFindAdminUserById() {
    }

    @Test
    public void userDoesNotLoggedIn() {
    }

Я знаю, что я не предоставляю никаких сведений о пользователе входа в систему для безопасности, но я не нашел информации о том, как это сделать в моей ситуации с тестами по контракту.

Я пытался установить аннотацию @WithMockUser(roles = "ADMIN") для методов тестирования, но это не работает.

Может, я недостаточно настроен для прохождения тестов? Кстати, у меня есть адрес электронной почты и пароль пользователя, который имеет доступ к этому API.

В автоматических испытаниях по методу, ниже которого согласно контракту

ResponseOptions response = given().spec(request)                     
    .get("/api/admin/a") 

Я ожидал код ответа 200 после прохождения тестов, но фактический код 401

1 Ответ

0 голосов
/ 11 июля 2019

Возможно, вы захотите написать интеграционный тест с @SpringBootTest вместо использования Spring Cloud Contract для проверки вашей безопасности. Spring Cloud Contract был создан для проверки входного и выходного уровня вашего коммуникационного уровня и для того, чтобы вы (производитель) знали, собираетесь ли вы сломать свой API, чтобы другие (потребители) столкнулись с проблемой при использовании вашего открытого API.

Пожалуйста, посмотрите на этот пример , как вы можете настроить тесты Spring Cloud Contract без запуска всего контекста приложения.

Надеюсь, это поможет! :)

...