Код, который я пытаюсь проверить:
Код: Выделить всё
@Service
@RequiredArgsConstructor
public class TicketService {
private final TicketRepository ticketRepository;
private final TicketServiceClient ticketSC;
private final TicketDTOMapper ticketDTOMapper;
UserInfoDTO getUserInfoFromContext(){
JwtAuthenticationToken token = (JwtAuthenticationToken) SecurityContextHolder.getContext().getAuthentication();
String email = token.getTokenAttributes().get("email").toString();
String role = token.getToken().getClaimAsStringList("spring_sec_roles").stream()
.filter(r -> r.startsWith("ROLE_"))
.findFirst()
.orElse(null);
String name = token.getTokenAttributes().get("preferred_username").toString();
Integer id = ticketSC.getUserID(email);
return new UserInfoDTO(id, role, email, name);
}
public ResponseEntity getAllowedTickets() throws InterruptedException {
UserInfoDTO userInfo = getUserInfoFromContext();
List tickets;
switch (userInfo.role()) {
case "ROLE_EMPLOYEE" -> tickets = ticketRepository.getAllTicketsForEmployee(userInfo.id());
case "ROLE_MANAGER" -> {
List employeeIDs = ticketSC.getAllEmployeeIDs();
tickets = ticketRepository.getAllTicketsForManager(userInfo.id(), employeeIDs);
}
case "ROLE_ENGINEER" -> {
List employeeAndManagerIDs = ticketSC.getAllEmployeeAndManagerIDs();
tickets = ticketRepository.getAllTicketsForEngineer(userInfo.id(), employeeAndManagerIDs);
}
default -> throw new IllegalStateException("Unexpected value: " + userInfo.role());
}
Set uniqueIDs = tickets.stream()
.flatMap(ticket -> Stream.of(ticket.getAssigneeID(), ticket.getApproverID(), ticket.getOwnerID()))
.filter(Objects::nonNull)
.collect(Collectors.toSet());
Map users = ticketSC.getUserInfoDTOs(uniqueIDs);
List ticketDTOs = ticketDTOMapper.allToDTOs(users, tickets);
System.out.println("ticketDTOS: "+ ticketDTOs + "\n"
+ "users: " + users + "\n"
+ "tickets: " + tickets + "\n"
+ "uniqueIDs: " + uniqueIDs );
return ResponseEntity.ok().body(ticketDTOs);
}
Код: Выделить всё
@ExtendWith(MockitoExtension.class)
class TicketServiceTest {
@Mock
private TicketRepository ticketRepository;
@Mock
private TicketServiceClient ticketSC;
@Mock
private TicketDTOMapper ticketDTOMapper;
@InjectMocks
private TicketService ticketService;
@BeforeEach
public void setUp() {
SecurityContextHolder.clearContext();
}
@AfterEach
public void tearDown() {
Mockito.reset(ticketRepository, categoryRepository, historyRepository, commentRepository, feedbackRepository, ticketSC, kafkaProducer,
ticketDTOMapper, ticketFullDTOMapper, ticketCreateDTOMapper, ticketEditDTOMapper, ticketStatDTOMapper, historyAttDTOMapper);
SecurityContextHolder.clearContext();
}
private void setSecurityContextForSpecificRole(String role) {
Map tokenAttributes = new HashMap();
tokenAttributes.put("email", "test@example.com");
tokenAttributes.put("preferred_username", "testUser");
Jwt jwt = mock(Jwt.class);
when(jwt.getClaimAsStringList("spring_sec_roles")).thenReturn(List.of(role, "some_authority1", "some_authority2"));
JwtAuthenticationToken token = mock(JwtAuthenticationToken.class);
when(token.getToken()).thenReturn(jwt);
when(token.getTokenAttributes()).thenReturn(tokenAttributes);
SecurityContext context = mock(SecurityContext.class);
when(context.getAuthentication()).thenReturn(token);
SecurityContextHolder.setContext(context);
}
@Test
public void testGetAllowedTicketsForEmployee() throws InterruptedException {
List tickets = Arrays.asList(
new Ticket(1, "Ticket1", "Descr1", LocalDate.of(2024, 2, 23), LocalDate.of(2024, 2, 26), null, 1, TicketState.New, new Category(1, "1Category"), TicketUrgency.Low, null, null, null, null),
new Ticket(2, "Ticket2", "Descr2", LocalDate.of(2024, 2, 24), LocalDate.of(2024, 2, 28), null, 1, TicketState.Approved, new Category(2, "2Category"), TicketUrgency.Low, 3, null, null, null),
new Ticket(3, "Ticket3", "Descr3", LocalDate.of(2024, 2, 25), LocalDate.of(2024, 2, 27), 5, 1, TicketState.In_progress, new Category(3, "3Category"), TicketUrgency.Average, 3, null, null, null)
);
Map users = Map.of(
1, new UserInfoDTO(1, "ROLE_EMPLOYEE", "employee@example.com", "testEmployee"),
3, new UserInfoDTO(3, "ROLE_MANAGER", "manager@example.com", "testManager"),
5, new UserInfoDTO(5, "ROLE_ENGINEER", "engineer@example.com", "testEngineer")
);
Set uniqueIDs = Set.of(1, 3, 5);
List ticketDTOs = Arrays.asList(
new TicketDTO(1, "Ticket1", "1Category", LocalDate.of(2024, 2, 23), LocalDate.of(2024, 2, 26), "employee@example.com", UserRole.Employee, null, null, TicketState.New, TicketUrgency.Low),
new TicketDTO(2, "Ticket2", "2Category", LocalDate.of(2024, 2, 24), LocalDate.of(2024, 2, 28), "employee@example.com", UserRole.Employee, "manager@example.com", null, TicketState.Approved, TicketUrgency.Low),
new TicketDTO(3, "Ticket3", "3Category", LocalDate.of(2024, 2, 25), LocalDate.of(2024, 2, 27), "employee@example.com", UserRole.Employee, "manager@example.com", "engineer@example.com", TicketState.In_progress, TicketUrgency.Average)
);
setSecurityContextForSpecificRole("ROLE_EMPLOYEE");
when(ticketSC.getUserID("test@example.com")).thenReturn(1);
when(ticketRepository.getAllTicketsForEmployee(anyInt())).thenReturn(tickets);
lenient().when(ticketSC.getUserInfoDTOs(uniqueIDs)).thenReturn(users);
when(ticketDTOMapper.allToDTOs(anyMap(), anyList())).thenReturn(ticketDTOs);
ResponseEntity response = ticketService.getAllowedTickets();
assertEquals(ResponseEntity.ok().body(ticketDTOs), response);
verify(ticketDTOMapper).allToDTOs(users, tickets);
verify(ticketRepository).getAllTicketsForEmployee(1);
verify(ticketSC).getUserInfoDTOs(uniqueIDs);
}
Код: Выделить всё
@Test
public void testGetAllowedTicketsForEmployee() throws InterruptedException {
Код: Выделить всё
List ticketDTOs = ticketDTOMapper.allToDTOs(users, tickets);
Но при попытке запустить TicketDTO выглядит как пустой список, хотя все данные до этого это правильно и соответствует всему, что я инициализировал в своем тестовом методе.
В режиме отладки все работает нормально - TicketDTOs соответствует списку, который у меня есть внутри тестового метода.
Подробнее здесь: https://stackoverflow.com/questions/788 ... debug-mode