Spring JPA может использовать любые совпадения в хранилище - PullRequest
0 голосов
/ 20 марта 2020

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

@ExtendWith(MockitoExtension.class)
public class TicketServiceTest {

    @Mock
    private TicketRepository ticketRepository;

    @InjectMocks
    private TicketService ticketService;

    @Test
    public void test_buy_ticket_successfully() {
        Ticket ticket = new Ticket(1, false, false, "");
        List<Ticket> availableTickets = Arrays.asList(ticket);

        Mockito.when(ticketRepository.findAllUnboughtAndUnpickedTickets()).thenReturn(availableTickets);
        Mockito.when(ticketRepo.findById(any(Integer.class)).thenReturn(Optional.of(any(Ticket.class));

        Ticket boughtTicket = ticketService.buyTicket("123");

        assertNotNull(boughtTicket);
        assertEquals(1, boughtTicket.getId());

        Mockito.verify(ticketRepository).findAllUnboughtAndUnpickedTickets();

    }

Ошибка, которую я получаю:

Type mismatch: cannot convert from Matcher<Integer> to Integer

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

public interface TickRep extends JpaRepository<Ticket, Integer>

Я использую весеннюю загрузку, junit 5.

Есть идеи?

1 Ответ

1 голос
/ 20 марта 2020

Существует проблема с ожиданиями установки линии:

thenReturn(Optional.of(any(Ticket.class));

Полученная ошибка

Type mismatch: cannot convert from Matcher<Integer> to Integer

предполагает, что вы используете сопоставители Hamcrest, а не Matcher Matchers.

См. Сопоставитель Мокито против сопоставителя Хэмкрест?

  • Мокито any() возвращается T,
  • Оголовье any() возвращается Matcher<T>

Вторая проблема: даже сопоставители Mockito нельзя использовать в контексте возвращаемого значения.

См .: Как работают сопоставители Mockito?

Методы сопоставления нельзя использовать в качестве возвращаемых значений; например, в «Мокито» нет словосочетания thenReturn(anyInt()) или thenReturn(any(Foo.class)). Mockito должен точно знать, какой экземпляр возвращать в вызовах-заглушках, и не выберет для вас произвольное возвращаемое значение.

...