Использование разных макетов Auth в тестах Spring Junit

Я использую Spring и Junit4 для тестирования своего серверного приложения. Мое приложение использует Spring Security, а некоторые запросы используют синтаксис SpEL для проверки зарегистрированного пользователя.

Поскольку я тестирую некоторые сценарии, требующие загрузки некоторых данных, у меня возникают проблемы, потому что я не имею права это делать.

Например:

@Test
    @WithUserDetails(userDetailsServiceBeanName = "mockUserDetailService", value = "customer")
    public void saveEcommerceTicket() {
        ZonedDateTime entryDate = ZonedDateTime.now().plusDays(1);
        createStandardFare();
        createDailyCode(entryDate.toInstant());
        createPaymentWithWallet();
        Customer customer = createCustomerWithWallet(new BigDecimal(100));

        Ticket ticket = new Ticket();
        ticket.setLicensePlate1("AA123BB");
        ticket.setArea(areaCentroStorico);
        ticket.setDailyCode("CC");
        ticket.setEntryDate(entryDate.toInstant());
        ticket.setExitDate(entryDate.plusDays(1).toInstant());
        ticket.setPassengers(50);
        ticket.setPassengersCountry(italy);
        ticket.setCustomer(customer);

        ticket = ticketService.saveFromEcommerceWithWalletPayment(ticket, new ArrayList<Media>());

        assertEquals(true, ticket.isStandard());
        assertEquals(TicketStatus.VALID, ticket.getStatus());
        assertTrue(new BigDecimal(100).compareTo(ticketRepository.sumPayments(ticket.getId())) == 0);
        assertTrue(BigDecimal.ZERO.compareTo(customer.getWallet().getBalance()) == 0);
        assertEquals(true, ticket.isPaid());
    }

Это пример теста, в котором я использую настраиваемую службу userdetail. К сожалению, для некоторых действий, таких как createStandardFare (), createDailyCode () и т. д., Требуется другая роль. Я пытался настроить аутентификацию вручную, но в итоге всегда получал весь тест с одной РОЛЬ. Вместо этого мне нужно, чтобы некоторые части выполнялись с определенной РОЛЬ (скажем, ADMIN), а некоторые другие - с другой (скажем, CUSTOMER).

Есть ли способ добиться этого с помощью Spring и Junit?

для проверки ролей вы можете использовать, например, @WithMockUser(roles = { "ADMIN", "CUSTOMER" }).

borino 15.03.2018 14:33

@borino Мне нужно проверить часть кода с определенной ролью (ADMIN), а другую часть с другой ролью (CUSTOMER). Это возможно?

drenda 15.03.2018 14:34

в этом случае вам нужен отдельный тест. Или объявите две роли, как в примере

borino 15.03.2018 14:36
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
363
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы вызываете разные методы в одном методе тестирования, для которых требуются разные роли, у вас действительно есть только два варианта.

  1. Настройте фиктивного пользователя (например, через @WithMockUser или аналогичный), которому назначены все роли, используемые в методе тестирования.
  2. Программно переключить текущего фиктивного пользователя в самом методе тестирования.
    • Например, используя следующие фрагменты кода.
@Test
public void test() {
    login("customer", "password", "ROLE_CUSTOMER");
    // ...
    login("admin", "password", "ROLE_ADMIN");
    // ...
}

static void login(String username, String password, String... roles) {
    SecurityContext context = SecurityContextHolder.createEmptyContext();

    User user = new User(username, password, roles(roles));

    Authentication auth = new UsernamePasswordAuthenticationToken(user, password, user.getAuthorities());
    context.setAuthentication(auth);
    SecurityContextHolder.setContext(context);
}

static List<SimpleGrantedAuthority> roles(String... roles) {
    return Arrays.stream(roles).map(SimpleGrantedAuthority::new).collect(toList());
}

Примечание. User в приведенном выше примере - это org.springframework.security.core.userdetails.User.

Мне пришлось использовать две разные роли пользователей в одном методе тестирования, этот код выполнил свою работу! Благодарность :-)

funder7 05.10.2020 13:23

Другие вопросы по теме