【发布时间】:2021-06-29 06:48:56
【问题描述】:
在我的 Java 代码中,我想用 Mockito 模拟一个返回布尔值的方法。 实际上,它涉及计算停车价格的停车应用程序。在我使用 Junit5 和 Mockito 进行的测试中,我模拟了一个方法,该方法返回一个布尔值来计算价格,如果该布尔值为真,则该值会减少。但是我的模拟不起作用,我不知道为什么......
when(ticketDao.isRegularCustomer(any(String.class))).thenReturn(true);
我希望这个模拟可以通过减少来计算价格。 感谢您的帮助,这是我的代码。
@ExtendWith(MockitoExtension.class)
public class FareCalculatorServiceTest {
private static FareCalculatorService fareCalculatorService;
private Ticket ticket;
@Mock
private static TicketDao ticketDao;
@BeforeAll
private static void setUp() {
fareCalculatorService = new FareCalculatorService();
}
@BeforeEach
private void setUpPerTest() {
ticket = new Ticket();
//when(ticketDao.isRegularCustomer(any())).thenReturn(false);
}
@Test
public void feature2CalculateFareBikeWith5PerCentReduceIfRegularCustomer(){
Date inTime = new Date();
inTime.setTime( System.currentTimeMillis() - (45 * 60 * 1000) );//45MIN IN PARKING
Date outTime = new Date();
ParkingSpot parkingSpot = new ParkingSpot(1, ParkingType.BIKE,false);
when(ticketDao.isRegularCustomer(any(String.class))).thenReturn(true);
ticket.setInTime(inTime);
ticket.setOutTime(outTime);
ticket.setParkingSpot(parkingSpot);
fareCalculatorService.calculateFare(ticket);
assertEquals((0.75 * Fare.BIKE_RATE_PER_HOUR-((0.75 * Fare.BIKE_RATE_PER_HOUR) * 5/100)), ticket.getPrice());
}
这是正在测试的代码
public void calculateFare(Ticket ticket) {
//resultTime is used to calculate parking's cost.
float resultTime;
if ((ticket.getOutTime() == null) || (ticket.getOutTime().before(ticket.getInTime()))) {
throw new IllegalArgumentException("Out time provided is incorrect:" + ticket.getOutTime().toString());
}
long inHour = ticket.getInTime().getTime();
long outHour = ticket.getOutTime().getTime();
//TODO: Some tests are failing here. Need to check if this logic is correct
long duration = outHour - inHour;
if (duration < ((30 * 60 * 1000))) {
resultTime = 0; //if duration is less than 30min, the cost is free for customer and result time is automatically set at 0.
} else {
resultTime = ((((float) duration / 1000) / 60) / 60);
}
if (ticketDao.isRegularCustomer(ticket.getVehicleRegNumber())) {
System.out.println("----------------------------------------");
System.out.println(" ----- 5% REDUCE ON OVERALL COST -----");
System.out.println("----------------------------------------");
switch (ticket.getParkingSpot().getParkingType()) {
case CAR: {
ticket.setPrice((resultTime * Fare.CAR_RATE_PER_HOUR) - ((resultTime * Fare.CAR_RATE_PER_HOUR) * 5 / 100));
System.out.println(ticket.getPrice());
break;
}
case BIKE: {
ticket.setPrice((resultTime * Fare.BIKE_RATE_PER_HOUR) - ((resultTime * Fare.BIKE_RATE_PER_HOUR) * 5 / 100));
System.out.println(ticket.getPrice());
break;
}
default:
throw new IllegalArgumentException("Unknown Parking Type");
}
} else {
switch (ticket.getParkingSpot().getParkingType()) {
case CAR: {
ticket.setPrice(resultTime * Fare.CAR_RATE_PER_HOUR);
System.out.println(resultTime * Fare.CAR_RATE_PER_HOUR);
break;
}
case BIKE: {
ticket.setPrice(resultTime * Fare.BIKE_RATE_PER_HOUR);
System.out.println(resultTime * Fare.BIKE_RATE_PER_HOUR);
break;
}
default:
throw new IllegalArgumentException("Unknown Parking Type");
}
}
}
}
【问题讨论】:
-
请出示被测代码
-
顺便说一句:不要再使用旧的
java.util.Date。使用现代的java.timeAPI -
看我的回答。你必须将你的模拟设置到你的服务中。
-
我认为,您可以删除帖子中的代码 TicketDao.java。这与您的情况无关。
标签: java unit-testing mockito junit5