Я использую 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?
@borino Мне нужно проверить часть кода с определенной ролью (ADMIN), а другую часть с другой ролью (CUSTOMER). Это возможно?
в этом случае вам нужен отдельный тест. Или объявите две роли, как в примере




Если вы вызываете разные методы в одном методе тестирования, для которых требуются разные роли, у вас действительно есть только два варианта.
@WithMockUser или аналогичный), которому назначены все роли, используемые в методе тестирования.@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.
Мне пришлось использовать две разные роли пользователей в одном методе тестирования, этот код выполнил свою работу! Благодарность :-)
для проверки ролей вы можете использовать, например,
@WithMockUser(roles = { "ADMIN", "CUSTOMER" }).