Spring security, тестирование MVC и заглушка для сервисов

398
17 января 2017, 23:33

Пытаюсь протестировать контроллер, у которого есть @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?

READ ALSO
Tesseract Android Java. Ошибка подключения языка

Tesseract Android Java. Ошибка подключения языка

За основу беру эту статьюhttp://www

326
Получения фокуса окна по PID

Получения фокуса окна по PID

В данной теме я узнал, как получить PID процессаИз выведенного списка все процессы Java отображаются просто java

332
Получить заголовок страницы webview

Получить заголовок страницы webview

Как получить заголовок страницы webview?

327
Spring SOAP Web-сервис генерация нескольких fault&#39;ов в wsdl

Spring SOAP Web-сервис генерация нескольких fault'ов в wsdl

Создал тестовый веб сервис наподобие вот этого туториала - http://spring-projectsru/guides/producing-web-service/

405