Весна: издевательство над безопасностью - PullRequest
0 голосов
/ 24 апреля 2018

Мы вносим часть нашей безопасности на уровне сервиса, поэтому я добавляю аннотацию @PreAuthorize к некоторым методам MyService.

На MyServiceSecurityTest Я хочу протестировать только матрицу разрешений ролей безопасности без какой-либо бизнес-логики.По этой причине я должен издеваться MyService.проблема заключается в том, что и Mockito, и Spring Security используют прокси-серверы CGLIB, и мой сервис не улучшен с @PreAuthorize после Mockito.mock(MyService.class).

Есть ли способ имитировать сервис и сохранить логику @PreAuthorize?


Пример:

@Service
public class MyService implements IMyService {

    @Override
    @PreAuthorize("hasAuthority('SYSOP')")
    public void someMethod(ComplexDTO dto) {
        // lots of logic and dependencies, require lots of stubbing.
    }
}

Во избежание инициализации всех зависимостей MyService#someMethod и построения ComplexDTO в MyServiceSecurityTest Я хочу издеваться MyServiceSecurityTest, но сохранить @PreAuthorize чеков.

1 Ответ

0 голосов
/ 24 апреля 2018

Вам нужно делать интеграционные тесты, а не юнит-тесты. В общем, вы не видите фиктивные классы в интеграционных тестах, по крайней мере, вы не будете насмехаться над классом, который вы тестируете, в этом случае я предполагаю, что это MyService класс.

Настройка интеграционных тестов подразумевает чтение, но приведенный ниже короткий пример поможет вам выбрать правильный путь

@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("myProfile")
public class MyServiceIT {

    private final Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    public void testMyService() {
        logger.info("testMyService");

        //user TestRestTemplate to call your service.
    }

}

EDIT: в этом интеграционном тесте Spring загружается нормально. Это означает, что все аннотации для безопасности обрабатываются, и все компоненты, необходимые для создания, создаются и правильно вводятся. Одной вещью, которую вам, возможно, придется контролировать, является профиль Spring .... это можно сделать с помощью аннотации @ActiveProfiles("myProfile"), которую я только что добавил в пример.

...