Тесты не выполняются при запуске, но проходят в режиме отладки.JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Тесты не выполняются при запуске, но проходят в режиме отладки.

Сообщение Anonymous »

У меня есть требование покрыть тестами весь мой личный проект. Пытаясь охватить хотя бы одну службу в своем проекте, я столкнулся с проблемой: запуск теста в режиме отладки проходит нормально, но запуск с другими тестами или отдельно приводит к сбою.
Код, который я пытаюсь проверить:

Код: Выделить всё

@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", "[email protected]");
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", "[email protected]", "testEmployee"),
3, new UserInfoDTO(3, "ROLE_MANAGER", "[email protected]", "testManager"),
5, new UserInfoDTO(5, "ROLE_ENGINEER", "[email protected]", "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), "[email protected]", UserRole.Employee, null, null, TicketState.New, TicketUrgency.Low),
new TicketDTO(2, "Ticket2", "2Category", LocalDate.of(2024, 2, 24), LocalDate.of(2024, 2, 28), "[email protected]", UserRole.Employee, "[email protected]", null, TicketState.Approved, TicketUrgency.Low),
new TicketDTO(3, "Ticket3", "3Category", LocalDate.of(2024, 2, 25), LocalDate.of(2024, 2, 27), "[email protected]", UserRole.Employee, "[email protected]", "[email protected]", TicketState.In_progress, TicketUrgency.Average)
);

setSecurityContextForSpecificRole("ROLE_EMPLOYEE");
when(ticketSC.getUserID("[email protected]")).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);
В этой строке метода моего сервиса я пытаюсь сопоставить объекты билетов с DTO, используя свой собственный преобразователь. Ничего особенного, он просто перебирает заявки и создает DTO, заменяя некоторые числовые поля соответствующими пользовательскими данными. При тестировании вручную работает нормально, так что проблема определенно не в логике картографа.
Но при попытке запустить TicketDTO выглядит как пустой список, хотя все данные до этого это правильно и соответствует всему, что я инициализировал в своем тестовом методе.
В режиме отладки все работает нормально - TicketDTOs соответствует списку, который у меня есть внутри тестового метода.

Подробнее здесь: https://stackoverflow.com/questions/788 ... debug-mode
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»