#java #spring #unit-testing #spring-mvc #spring-security
Вопрос:
Я пытаюсь модульно протестировать свои API, которые имеют аннотацию @PreAuthorize. Я получаю группы cognito от Jwt и использую их в качестве авторитетов. Я проверяю то же самое в аннотации предварительной авторизации в методах api. ОБНОВЛЕНИЕ:
Я получаю 404 Без удаления сопоставления profile/VOlUc3F5A_test.txt существует
Тестовый класс:
import combackend.StorageController;
import com.backend.config.;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResu<
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = Config.class)
@SpringBootTest
@AutoConfigureMockMvc
//@WebMvcTest(StorageController.class)
public class Tests {
@Autowired
private MockMvc mockMvc;
@Test
@WithMockUser(username = "admin@domain.com", password = "Password", authorities = "admin")
public void testDeleteCardProfile() throws Exception {
MvcResult result = mockMvc.perform(MockMvcRequestBuilders
.delete("http://localhost:9092/profile/{fileKey}", "VOlUc3F5A_test.txt").with(SecurityMockMvcRequestPostProcessors.csrf())).andReturn();
Assert.assertEquals(200, result.getResponse().getStatus());
// .andExpect(status().isOk());
}
}
Способ управления:
@ApiResponses({ @ApiResponse(responseCode = "204", description = "Returns the delete success message"),
@ApiResponse(responseCode = "400", description = "Failed to delete file : Badrequest"),
@ApiResponse(responseCode = "404", description = "Failed to delete file, NotFound") })
@RequestMapping(value = "/profile/{fileKey}", consumes = MediaType.ALL_VALUE, method = { RequestMethod.DELETE })
@PreAuthorize("hasAuthority('admin')")
public Mono<Boolean> deleteProfile(@AuthenticationPrincipal Jwt jwt, @PathVariable("fileKey") String fileKey) {
return storageService.removeProfile(fileKey);
}
Ответ №1:
В сообщении об ошибке говорится, что this.mockMvc
это null
так . В коде, которым вы поделились, вы нигде не инициализируете this.mockMvc
.
Возможно, вы хотите подключить его автоматически
@Autowired
private MockMvc mockMvc;
Комментарии:
1. это сработало. Спасибо. Но тест всегда возвращает ошибку 403 Forbiiden.
2. Возможно, у вас включена защита от CSRF. Ознакомьтесь с этим разделом документации.
3. да, я знаю. обновил код, запрос на проверку. Я получаю ошибку 404 «Не найдено сопоставление». даже несмотря на то, что, как вы можете видеть, метод контроллера имеет точно такое же отображение
Ответ №2:
Проблема с тем, что вы делаете, заключается mockMvc
в том, что он не настроен для работы с spring security во время тестов. Ваше текущее решение касается только Method Security
См. для уточнения.
Настройте свой mockMvc
правильно, и он должен работать.
@Before
public void setup() {
mvc = MockMvcBuilders
.webAppContextSetup(context)
.apply(springSecurity())
.build();
}
Комментарии:
1. я изменил его. я не получаю ошибку mockmvc, но тест всегда возвращает ошибку 403 Forbiiden.
2. Вы уже настроили свой MockMvc с помощью spring security?
3. А также удалена автоматическая проводка mockmvc, так как вам нужно построить его самостоятельно
4. обновил код, запрос на проверку. Я получаю ошибку 404 «Не найдено сопоставление». даже несмотря на то, что, как вы можете видеть, метод контроллера имеет точно такое же отображение
5. Можете ли вы попробовать удалить
http://localhost:9092
?