带有 returns 布尔值的方法的 Mockito 不被我的代码考虑
Mockito with method which returns a boolean is not considered by my code
在我的 Java 代码中,我想用 Mockito 模拟一个 return 布尔值的方法。
事实上,它涉及计算停车价格的停车应用程序。在我使用 Junit5 和 Mockito 进行的测试中,我模拟了一个方法,其中 return 一个布尔值,如果此布尔值为真,则使用 reduce 计算价格。但是我的模拟不起作用,我不知道为什么...
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");
}
}
}
}
您必须将 ticketDao 的模拟设置到 fareCalculatorService 中:
- 使用 setter(在您的方法或 @Before 方法中)
- 在您测试的 fareCalculatorService 声明中使用 @InjectMocks 注释 class
像那样:
@InjectMocks
private static FareCalculatorService fareCalculatorService;
如果你这样做,你将不得不删除你的@BeforeAll 方法。
在我的 Java 代码中,我想用 Mockito 模拟一个 return 布尔值的方法。 事实上,它涉及计算停车价格的停车应用程序。在我使用 Junit5 和 Mockito 进行的测试中,我模拟了一个方法,其中 return 一个布尔值,如果此布尔值为真,则使用 reduce 计算价格。但是我的模拟不起作用,我不知道为什么...
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");
}
}
}
}
您必须将 ticketDao 的模拟设置到 fareCalculatorService 中:
- 使用 setter(在您的方法或 @Before 方法中)
- 在您测试的 fareCalculatorService 声明中使用 @InjectMocks 注释 class
像那样:
@InjectMocks
private static FareCalculatorService fareCalculatorService;
如果你这样做,你将不得不删除你的@BeforeAll 方法。