Пытаюсь протестировать контроллер, у которого есть @PreAuthorize
и сервис, который надо подменить заглушкой
PlayerController.java
@RestController
@RequestMapping(value = "/player")
public class PlayerController {
@Autowired
private PlayerService playerService;
@PreAuthorize("hasAuthority('ADMIN')")
@RequestMapping(value = "/all", method = RequestMethod.GET, produces = "application/json")
public
@ResponseBody
ResponseEntity<List<String>> loadByAdmin()
throws Exception {
return new ResponseEntity<>(playerService.getPlayers(), HttpStatus.OK);
}
}
PlayerServiceImpl.java
@Service
public class PlayerServiceImpl implements PlayerService{
@Autowired
private PlayerRepo playerRepo;
@Transactional(readOnly = true)
public List<String> getPlayers()() {
return playerRepo.findAll();
}
}
Первый способ тестирования: в этом случае тест проходит, но как вы можете заметить у пользователя authority
выставлен SOMEONE
, поэтому тест должен падать, т.к. данный контроллер доступен только для администратора
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = {WebAppConfig.class, SecurityConfiguration.class})
public class PlayerControllerTest {
private MockMvc mockMvc;
@Autowired
private FilterChainProxy springSecurityFilterChain;
@Mock
private PlayerService playerService;
@InjectMocks
private PlayerController playerController;
@Test
public void loadByAdmin()
throws Exception {
Player player = new player();
when(PlayerService.getPlayers()).thenReturn(Collections.singletonList(player));
mockMvc.perform(get("/circuit/all").with(user("adm").password("123")
.authorities(new SimpleGrantedAuthority("SOMEONE"))) //Не завалился
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk());
verify(PlayerService, times(1)).getPlayers();
verifyNoMoreInteractions(PlayerService);
}
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mockMvc = MockMvcBuilders
.standaloneSetup(playerController)
.apply(SecurityMockMvcConfigurers.springSecurity(springSecurityFilterChain))
.build();
}
Второй способ тестирования: для авторизации он работает правильно, но вот PlayerService при этом не получаеть подменить заглушкой.
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = {WebAppConfig.class, SecurityConfiguration.class})
public class PlayerControllerTest {
private MockMvc mockMvc;
@Autowired
private WebApplicationContext wac;
@Mock
private PlayerService playerService;
@InjectMocks
private PlayerController playerController;
@Test
public void loadByAdmin()
throws Exception {
Player player = new player();
when(PlayerService.getPlayers()).thenReturn(Collections.singletonList(player)); //Не получилось заглушить
mockMvc.perform(get("/circuit/all").with(user("adm").password("123")
.authorities(new SimpleGrantedAuthority("ADMIN")))
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk());
verify(PlayerService, times(1)).getPlayers(); //Вызова не было
verifyNoMoreInteractions(PlayerService);
}
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
this.mockMvc.webAppContextSetup(wac)
.apply(springSecurity())
.build();
}
Как сделать так чтобы можно было подменить заглушкой PlayerService
и чтобы при этом работал @PreAuthorize
?
В данной теме я узнал, как получить PID процессаИз выведенного списка все процессы Java отображаются просто java
Создал тестовый веб сервис наподобие вот этого туториала - http://spring-projectsru/guides/producing-web-service/