Есть тестовый класс :
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)
Решил проблему так : Объявил в сервисе setter для всех мапперов , и в тестах вручную засетил мапперы
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Когда я нажимаю первый раз, кнопки идут и возвращаются с другими буквами, но когда я нажимаю снова, ничего не происходит:
Добрый вечер, подскажите пожалуйста, каким образом можно нарисовать прямоугольник, чтобы он сам подстраивался под размеры экрана, гугл не помогаетНашел...
Есть TextView в котором имеются несколько ссылокПри нажатии на TextView появляется PopupMenu