Неправильно работает Mock

228
17 декабря 2017, 10:08

Есть тестовый класс :

package dev5.lavishek.trains.services.impl;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.atLeastOnce;
import dev5.lavishek.trains.dao.TicketRepository;
import dev5.lavishek.trains.dto.TicketDTO;
import dev5.lavishek.trains.dto.TrainDTO;
import dev5.lavishek.trains.dto.UserDTO;
import dev5.lavishek.trains.entity.Ticket;
import dev5.lavishek.trains.entity.Train;
import dev5.lavishek.trains.entity.User;
import dev5.lavishek.trains.services.TrainService;
import dev5.lavishek.trains.utils.mapper.DtoMapper;
import java.time.LocalDate;
import java.util.Collections;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class TicketServiceImplTest {

  @Mock
  private DtoMapper<TicketDTO, Ticket> ticketMapper;
  @Mock
  private DtoMapper<TrainDTO, Train> trainMapper;
  @Mock
  private DtoMapper<UserDTO, User> userMapper;
  @Mock
  private TrainService trainService;
  @Mock
  private TicketRepository repository;
  @Mock
  private Ticket ticket;
  @Mock
  private TicketDTO ticketDTO;
  @InjectMocks
  private TicketServiceImpl service;
  @Before
  public void setUp() throws Exception {
    Mockito.when(ticket.getId()).thenReturn(1);
    Mockito.when(ticketDTO.getId()).thenReturn(1);
    Mockito.when(ticketMapper.toDto(any(Ticket.class))).thenReturn(ticketDTO);
    Mockito.when(ticketMapper.toEntity(any(TicketDTO.class))).thenReturn(ticket);
    Mockito.when(repository.getTicketsByTrainAndDate(anyInt(), any()))
        .thenReturn(Collections.singletonList(ticket));
    Mockito.when(userMapper.toEntity(any(UserDTO.class)))
        .thenReturn(User.builder().id(1).build());
    Mockito.when(trainMapper.toEntity(any(TrainDTO.class)))
        .thenReturn(Train.builder().id(1).build());
    Mockito.when(trainService.findById(anyInt())).thenReturn(TrainDTO.builder().id(1).build());
  }

  @Test
  public void findTicketsByTrainAndDate() throws Exception {
    service.findTicketsByTrainAndDate(1, LocalDate.now());
    Mockito.verify(repository, atLeastOnce()).getTicketsByTrainAndDate(anyInt(), any());
    Mockito.verifyNoMoreInteractions(repository);
  }
  @Test
  public void bookingTicket() throws Exception {
    service.bookingTicket(TicketDTO.builder().build(), 1);
    Mockito.verify(repository, atLeastOnce()).save(any(Ticket.class));
    Mockito.verifyNoMoreInteractions(repository);
  }
}

Класс который тестируется :

package dev5.lavishek.trains.services.impl;
import dev5.lavishek.trains.dao.TicketRepository;
import dev5.lavishek.trains.dto.TicketDTO;
import dev5.lavishek.trains.dto.TrainDTO;
import dev5.lavishek.trains.dto.UserDTO;
import dev5.lavishek.trains.entity.RailwayCarriage;
import dev5.lavishek.trains.entity.Ride;
import dev5.lavishek.trains.entity.Station;
import dev5.lavishek.trains.entity.Ticket;
import dev5.lavishek.trains.entity.Train;
import dev5.lavishek.trains.entity.User;
import dev5.lavishek.trains.services.TicketService;
import dev5.lavishek.trains.services.TrainService;
import dev5.lavishek.trains.services.UserService;
import dev5.lavishek.trains.utils.mapper.DtoMapper;
import java.time.LocalDate;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class TicketServiceImpl implements TicketService {
  private final DtoMapper<TicketDTO, Ticket> ticketMapper;
  private final DtoMapper<TrainDTO, Train> trainsMapper;
  private final DtoMapper<UserDTO, User> userMapper;
  private final TicketRepository repository;
  private final TrainService trainService;
  private final UserService userService;
  @Autowired
  public TicketServiceImpl(
      @Lazy DtoMapper<TicketDTO, Ticket> ticketMapper,
      @Lazy DtoMapper<TrainDTO, Train> trainsMapper,
      @Lazy DtoMapper<UserDTO, User> userMapper,
      @Lazy TicketRepository repository,
      @Lazy TrainService trainService,
      @Lazy UserService userService) {
    if (log.isDebugEnabled()) {
      log.debug("TicketServiceImplConstructor");
    }
    this.ticketMapper = ticketMapper;
    this.trainsMapper = trainsMapper;
    this.userMapper = userMapper;
    this.repository = repository;
    this.trainService = trainService;
    this.userService = userService;
  }

  @Override
  public List<TicketDTO> findTicketsByTrainAndDate(Integer idTrain, LocalDate date) {
    if (log.isDebugEnabled()) {
      log.debug("findTicketsByTrainAndDate(" + idTrain + "," + date + ")");
    }
    return ticketMapper.toDto(repository.getTicketsByTrainAndDate(idTrain, date));
  }
  @Override
  public TicketDTO bookingTicket(TicketDTO ticket, Integer idUser) {
    if (log.isDebugEnabled()) {
      log.debug("bookingTicket(" + ticket + "," + idUser + ")");
    }
    ticket.setId(null);
    Ticket ticketEntity = ticketMapper.toEntity(ticket);
    Train train = trainsMapper
        .toEntity(trainService.findById(ticket.getTrain().getId()));
    Station from = null, to = null;
    Boolean calculatePrice = false;
    Double travelPrice = 0d;
    for (Ride ride : train.getRides()) {
      if (ride.getStationFrom().equals(ticketEntity.getFrom())) {
        from = ride.getStationFrom();
        calculatePrice = true;
      }
      if (calculatePrice) {
        travelPrice += ride.getPrice();
      }
      if (ride.getStationTo().equals(ticketEntity.getTo())) {
        to = ride.getStationTo();
        calculatePrice = false;
      }
    }
    RailwayCarriage carriage = null;
    for (RailwayCarriage railwayCarriage : train.getCarriages()) {
      if (railwayCarriage.getNumber().equals(ticketEntity.getCarriage().getNumber())) {
        carriage = railwayCarriage;
      }
    }
    Ticket addedTicket = Ticket.builder()
        .firstNamePassenger(ticketEntity.getFirstNamePassenger())
        .lastNamePassenger(ticketEntity.getLastNamePassenger())
        .passportID(ticketEntity.getPassportID())
        .dateDeparture(ticketEntity.getDateDeparture())
        .numberPlace(ticketEntity.getNumberPlace())
        .train(train).from(from)
        .to(to)
        .carriage(carriage)
        .owner(userMapper.toEntity(userService.findById(idUser)))
        .price(travelPrice * (carriage != null ? carriage.getPriceCoefficient() : 1))
        .build();
    return ticketMapper.toDto(repository.save(addedTicket));
  }
}

Во время выполнения вместо :

 private final DtoMapper<TicketDTO, Ticket> ticketMapper;
  private final DtoMapper<TrainDTO, Train> trainsMapper;
  private final DtoMapper<UserDTO, User> userMapper;

Инжектиться везде trainMapper

Stacktrace :

java.lang.ClassCastException: dev5.lavishek.trains.entity.Train cannot be cast to dev5.lavishek.trains.entity.Ticket
    at dev5.lavishek.trains.services.impl.TicketServiceImpl.bookingTicket(TicketServiceImpl.java:69)
    at dev5.lavishek.trains.services.impl.TicketServiceImplTest.bookingTicket(TicketServiceImplTest.java:73)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37)
    at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Answer 1

Решил проблему так : Объявил в сервисе setter для всех мапперов , и в тестах вручную засетил мапперы

READ ALSO
Почему не меняется текст кнопки при анимации

Почему не меняется текст кнопки при анимации

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

226
Рисование android

Рисование android

Добрый вечер, подскажите пожалуйста, каким образом можно нарисовать прямоугольник, чтобы он сам подстраивался под размеры экрана, гугл не помогаетНашел...

237
Как изменить цвет иконок в toolbar?

Как изменить цвет иконок в toolbar?

У меня есть тулбар к которому я добавил список с меню

273
Как сделать URL ссылки не нажимаемыми?

Как сделать URL ссылки не нажимаемыми?

Есть TextView в котором имеются несколько ссылокПри нажатии на TextView появляется PopupMenu

239