Spring Security вызывает проблемы при выполнении юнит-тестов на контроллере REST - PullRequest
1 голос
/ 24 апреля 2020

Так что в основном я делаю некоторые модульные тесты на моем контроллере покоя, до того, как использовать Spring Security, все работало гладко, после добавления его и установки безопасности Spring для моего макета mvc, он всегда возвращает 302 и ничего больше, после Работая с моим кодом и браузером, я обнаружил, что после входа в систему, я действительно получаю код 302, который соответствует назначению из-за перенаправления, кажется, что loginProcessingUrl в моей конфигурации вызывает это:

Моя весенняя конфигурация безопасности:

 @Override
    protected void configure(HttpSecurity http) throws Exception
    {
        http.authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                .formLogin()
                .loginPage("/showMyLoginPage")
                .loginProcessingUrl("/authenticateTheUser")
                .permitAll()
                .and()
                .logout()
                .logoutSuccessUrl("/")
                .logoutUrl("/logoutUser")
                .and()
                .csrf()
                .disable();
    }

Метод REST, который я тестирую:

    @GetMapping(path = "/list/getProducts")
    public String getProducts()
    {
        List<Product> products = productService.getProducts();
        return gson.toJson(products);
    }

И, наконец, мой тест:

@RunWith(SpringRunner.class)
@ContextConfiguration(locations = "file:src/test/java/resources/ProductCRUD-servlet.xml")
@WebAppConfiguration
public class ProductControllerTest
{

    @Autowired
    WebApplicationContext context;

    @InjectMocks
    private ProductRestController productRestController;

    @Mock
    private ProductService productService;

    private MockMvc mockMvc;

    @Before
    public void setup()
    {
        MockitoAnnotations.initMocks(this);
        mockMvc = MockMvcBuilders
                .webAppContextSetup(context)
                .apply(springSecurity())
                .build();
    }

    @Test
    public void getAllProductsTest() throws Exception
    {
        List<Product> products = new ArrayList<>();
        products.add(new Product("4532", 123, "Product test", "test"));
        Mockito.when(productService.getProducts())
                .thenReturn(products);
        mockMvc.perform(MockMvcRequestBuilders
                .get("/product/list/getProducts"))
                .andExpect(status().isOk)
                .andExpect(content().string(containsString("\"productId\":\"4534\"")));    
    }

Итак, что происходит , хотя мой веб-сайт работает и я получаю json, процесс входа в систему как-то портит мой тест.

enter image description here

Даже если я установите мой тестовый код состояния на 302 вместо 200, он ничего не возвращает.

Expected :a string containing "\"productId\":\"4534\""
Actual   :""

TLDR: при тестировании моего REST API, который защищен весенней безопасностью, я не могу достичь API из тестов.

1 Ответ

1 голос
/ 27 апреля 2020

Для весенних интеграционных тестов безопасности мы можем использовать @WithMockUser в качестве методов, предложенных 11. Безопасность метода тестирования (текущее руководство по безопасности пружин) .

Однако также полезно протестировать «ограниченный сценарий ios», где мы предоставим неавторизованного / пропущенного / анонимного пользователя и подтвердим для соответствующие реакции (исключения, http коды, перенаправления, ...).

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